Какие разделы необходимы в минимальной динамической ELF-программе?

Я собрал простую программу «Hello, world» и слинковал ее с помощью TCC, после чего получил 4196 байт исполняемого файла.

В программе 31 раздел: ['', '.text', '.data', '.bss', '.symtab', '.strtab', '.rel.text', '.rodata', '.rodata.cst4', '.note.GNU-stack', '.init', '.rel.init', '.gnu.linkonce.t.__x86.get_pc_thunk.bx', '.fini', '.rel.fini', '.text.unlikely', '.text.__x86.get_pc_thunk.bx', '.eh_frame', '.rel.eh_frame', '.preinit_array', '.init_array', '.fini_array', '.interp', '.dynsym', '.dynstr', '.hash', '.dynamic', '.got', '.plt', '.rel.got', '.shstrtab']. Я чувствую, что это очень много для такого простого двоичного файла - какие из них действительно необходимы для запуска моей программы?

Вот исходный код и то, как я его скомпилировал:

        extern printf
        global main

        section .data
msg:    db "Hello World!", 0

        section .text
main:
        ;;  puts (msg)
        push msg
        call printf
        add esp, 4

        ;;  return 0
        mov eax, 0
        ret

nasm main.asm -f elf32 && tcc main.o -o главная

Протестировано на 32bit/ubuntu:16.04 образе Docker.

Примечание: этот вопрос отличается от этого один в том, что я не ищу напряженный Linux ELF, а тот, который позволяет мне вызывать динамические символы. Я считаю, что из-за природы динамического связывания мне нужны дополнительные разделы.


person d33tah    schedule 25.12.2016    source источник
comment
Покажите нам исходный код и вывод objdump (или аналогичного), а не двоичный код в кодировке base64. Вы используете ЭЛТ? Символы отладки?   -  person Margaret Bloom    schedule 25.12.2016
comment
@MargaretBloom: отредактировал вопрос.   -  person d33tah    schedule 25.12.2016
comment
@MichaelFoukarakis: не совсем так. Я имею в виду динамически связанный ELF, это совсем другая история.   -  person d33tah    schedule 25.12.2016
comment
ЭЛЬФ есть ЭЛЬФ есть ЭЛЬФ. Чем отличается ваш вопрос? Быть конкретными.   -  person Michael Foukarakis    schedule 25.12.2016
comment
@MichaelFoukarakis: мне нужен ELF, который может вызывать printf из libc. Это добавляет дополнительные ограничения из-за природы динамического связывания. Подозреваю, что худо-бедно еще и .interp нужно, а что еще - не знаю.   -  person d33tah    schedule 25.12.2016
comment
@d33tah Поможет ли вам strip?   -  person Margaret Bloom    schedule 25.12.2016
comment
Возможный дубликат Каковы передовые методы работы с общими библиотеками в Linux? Обратите особое внимание на ответ Ульриха Дреппера Как писать разделяемые библиотеки.   -  person jww    schedule 25.12.2016
comment
@ d33tah, это (тоже) рассматривается в связанном вопросе.   -  person Michael Foukarakis    schedule 25.12.2016
comment
Строго говоря, я не думаю, что вам нужны какие-либо разделы в исполняемом файле ELF. Динамический загрузчик использует только информацию в заголовке программы и то, к чему она относится, для загрузки и динамической компоновки исполняемого файла. Большая часть этой информации соответствует определенным именованным разделам, но на самом деле вам нужен заголовок программы с правильно заполненными сегментами LOAD, INTERP и DYNAMIC.   -  person Ross Ridge    schedule 25.12.2016
comment
Итак, после всех правок и уточнений, является ли это дубликатом любого из предложенных дубликатов? Похоже, что нет, поэтому я воздержусь от дублирования этого.   -  person Peter Cordes    schedule 26.12.2016


Ответы (1)


Я считаю, что из-за природы динамического связывания мне нужны дополнительные разделы.

Ваше убеждение ошибочно. Никаких разделов не требуется во время выполнения, важны только сегменты.

Запускаемый динамически связанный двоичный файл ELF будет иметь как минимум один сегмент PT_LOAD, сегмент PT_INTERP и сегмент PT_DYNAMIC.

person Employed Russian    schedule 27.12.2016