Добавляет ли GNU Assembler собственную точку входа?

Скажем, у меня есть следующий код сборки:

.section .text

.globl _start
_start:

Если бы я создал исполняемый файл, используя следующие команды:

as 1.s -o 1.o
ld 1.o -o 1

Добавит ли ассемблер GNU свою собственную точку входа в мой исполняемый файл, который вызывает _start, или _start будет фактической точкой входа?

Дополнительные сведения см. в этом вопросе.


person Community    schedule 12.01.2015    source источник
comment
Я ожидаю, что ассемблер не будет, это не его роль. Это работа для компоновщика. Когда компоновщику говорят связать все вместе в архив/библиотеку, он не вводит точку входа _start. С другой стороны, когда ему говорят связать исполняемый файл, он связывается со средой выполнения C (crt1.o), которая среди прочего объявляет функцию _start, которая является точкой входа по умолчанию. Поскольку вы объявляете это сами, вам придется запретить компоновщику пытаться связать во время выполнения C из-за ошибки. В качестве альтернативы GNU ld позволяет вам выбрать другую точку входа с опцией -e.   -  person Iwillnotexist Idonotexist    schedule 12.01.2015


Ответы (2)


Файл crt0.o (или crt1.o, или как называется этот файл), который содержит код запуска, упомянутый в другом вопросе, также был написан на ассемблере.

Итак, что делает компоновщик ("ld"), так это ищет во всех объектных файлах (которые на самом деле все созданы с помощью "as") символ с именем "_start", который становится точкой входа.

Вы, конечно, можете добавить crt0.o в свою программу, написанную на ассемблере, при использовании "ld". Однако в этом случае вы НЕ ДОЛЖНЫ называть свой символ «_start», а «main» в вашем файле ассемблера:

.globl main
.text
main:
    ...

В противном случае "ld" напечатает сообщение об ошибке, потому что найдет два символа с именем "_start" и не знает, какой из них является точкой входа!

person Martin Rosenau    schedule 12.01.2015

Вы можете проверить это следующим образом:

objdump -x 1 # n.b. 1 is the name of your program

Это напечатает, среди прочего:

start address 0x000000...

Возьмите адрес, который он вам дает, и найдите его в другом месте вывода. Я думаю, вы обнаружите, что он соответствует началу сегмента .text, а также символу _start. Если это так, то _start действительно является точкой входа в ELF.

person John Zwinck    schedule 12.01.2015