Как скомпилировать сборку, чья точка входа не является основной с gcc? - PullRequest
4 голосов
/ 03 июля 2011
.text
    .globl _start
_start:
     pushq %rbp
     movq %rsp,%rbp
     movq $2, %rax
     leaveq
     retq

Я компилирую с -nostdlib:

[root@ test]# gcc -nostdlib -Wall minimal.S &&./a.out 
Segmentation fault

Что здесь не так?

Кстати, возможно ли сделать точку входа другими именами, кроме main и _start?

Ответы [ 2 ]

5 голосов
/ 03 июля 2011

Как упоминает @jaquadro, вы можете указать точку входа в командной строке для компоновщика (или использовать скрипт ссылки): gcc -Wall -Wextra -nostdlib -Wl,-eMyEntry minimal.S && ./a.out

Причина, по которой ваша программа вызывает ошибки, заключается в том, что, поскольку выне используя стандартную библиотеку, возвращаться назад некуда (retq).Вместо этого вызовите exit, используя правильный системный вызов (в данном случае это значение 60, которое вводится в rax, первый (и единственный) параметр вводится в rdi.

Пример:

.text
.globl MyEntry
MyEntry:
    # Use Syscall 60 (exit) to exit with error code 42
    movq $60, %rax
    movq $42, %rdi
    syscall

Смежный вопрос о том, как выполнять системные вызовы на x86_64

1 голос
/ 03 июля 2011

Вы можете установить точку входа, передав опцию компоновщику

http://sca.uwaterloo.ca/coldfire/gcc-doc/docs/ld_24.html

Чтобы сделать это с помощью gcc, вы должны сделать что-то вроде ...

gcc all_my_other_gcc_commands -Wl,-e,start_symbol

main отличается, это не точка входа в ваше скомпилированное приложение, хотя это функция, которая будет вызываться из точки входа.Сама точка входа, если вы компилируете код на C или C ++, определяется в чем-то вроде Start.S глубоко в дереве исходных кодов glibc и зависит от платформы.Если вы программируете прямую сборку, я не знаю, что на самом деле происходит.

...