LINUX.ORG.RU

[ld] Указание положения функции в бинарном файле

 


0

0

Для работы программы необходимо чтобы точка входа в программу располагалась по адресу 0x0(тоесть в самом начале секции .text). Однако при линковке туда попадает левая функция которая на самом деле не является точкой входа.

Вопрос : можно ли указать для ld что бы он помещал функцию main в начало секции .text?

Для работы используется простой бинарник(arm-elf-objcopy -R .note -R .comment -S -O binary test test.bin). По этому и необходимо расположить main в начале.


>по адресу 0x0(тоесть в самом начале секции .text)

$ readelf /bin/bash -S
...
Section Headers:
  [Nr] Name              Type             Address           Offset      Size              EntSize          Flags  Link  Info  Align
...
  [12] .text             PROGBITS         0000000000415f90  00015f90
       00000000000671b8  0000000000000000  AX       0     0     16
Ня?

anon_666
()
Ответ на: комментарий от anon_666

У ld есть опция -Ttext 0x0.


arm-elf-readelf test -S
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00000000 000074 002938 00 WAX  0   0  4

recon88
() автор топика
Ответ на: комментарий от anon_666

Спасибо!

Сделал entry point(правда на С), вида:

 int entry() { main(); } 

А потом слинковал, при этом либу с entry point поместил в начало.

 ld -e entry -Ttext 0x0 entry.o ....(другие либы с main) 

Для начала подойдет. Но интересно правильное решение этой задачи(мне видится необходимость использования linker script, можно ли с его помощью получить нужное поведение?).

recon88
() автор топика
Ответ на: комментарий от recon88

Вообще, функции располагаются в бинарнике в том же порядке, что и в исходнике.
Но гарантировать это нельзя.

anon_666
()
Ответ на: комментарий от recon88

>мне видится необходимость использования linker script, можно ли с его помощью получить нужное поведение?

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

Собственно linker scripts и были придуманы для того, что бы указывать по каким адресам что находиться ;)

nanoo_linux
()
Ответ на: комментарий от nanoo_linux

пример использования linker scripts: http://wiki.osdev.org/Bare_bones#linker.ld

Ядро крошечной ОС (загрузчик + вывод hello world + kernel panic), загружаемой GRUB-ом. Делается ELF файл с секциями по нестандартным адресам (ядро), который будет грузиться загрузчиком. Скрипты линкера нужны чтобы расположить секции ядра в нужном порядке (как будет грузить GRUB).

Ещё можно воспользоваться elfweaver: http://stackoverflow.com/questions/2165895/looking-for-a-binary-image-layout-... , тулза от OK4Labs для тех же целей — несколько ELF файлов сливаются в один ELF, который умеет грузить GRUB. Такой objcopy + ld scripts с XML конфигом.

В ОС Хайку использовался немного нестандартный ELF формат, бинарно совместимый с BeOS, немного несовместимый с Linux. У них ядро на C++, ну и немного наворочены секции динамического импорта/экспорта, свои linker scripts. Правда, какие-то хрупкие — я собирал компилятор D под Haiku, наткнулся на проблему с этими linker scripts (которой не было в Gentoo с другими linker scripts, с другим ELF форматом).

anonymous
()

> Однако при линковке туда попадает левая функция которая на самом деле не является точкой входа.

Если собираешь бинарник, который будет грузиться не стандартным загрузчиком, можно указать gcc не линковать стандартные библиотеки (C runtime library) : -nostdlib -nostartfiles -nodefaultlibs

-nostartfiles уберёт пролог/эпилог для main в ,entry (он не нужен, если будешь грузить бинарник сам)

gcc -o kernel.o -c kernel.c -Wall -Wextra -Werror -nostdlib -nostartfiles -nodefaultlibs

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.