Использование определенной пользователем точки входа в сборку x86-64 nasm при компиляции с gcc - PullRequest
0 голосов
/ 08 февраля 2019

Я недавно начал изучать ассемблер, и мне было интересно, возможно ли для нас иметь собственную точку входа для кода ассемблера при компиляции с помощью gcc?

Например, стандартный код, который компилируется с помощью gcc:

global main

section .data

section .bss

section .text

main:

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

глобальное добавление

section .data

section .bss

section .text

добавление:

Причиной того, почему я в первую очередь использую gcc для компиляции, является то, что я использую библиотеки c в коде моей сборки для "printf"и «scanf», и каждый раз, когда я пытался изменить точку входа, я получал неопределенную ссылку на основную ошибку.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы можете разместить несколько ярлыков на одном и том же адресе.Таким образом, вы можете прикрепить метку main в любое место, где вы хотите, чтобы код запуска CRT был call.

global main
main:
addition:
   lea  eax, [rdi+rdi]    ; return argc*2
   ret

Я проверил, и GDB решит показать main в разборке для блокакод после метки, независимо от того, какой из них вы объявите первым.(`Глобальное добавление тоже не помогает.)


Если вы хотите изменить одну строку вверху вашего файла, чтобы выбрать, какая функция является точкой входа main, выможет быть, может сделать

%define addition main

Я не уверен, позволяет ли NASM создать псевдоним или слабый псевдоним для символа, как с GAS
.weakref main, addition.( Вызов функции в другом объектном файле без использования PLT в общей библиотеке? )

0 голосов
/ 08 февраля 2019

Если вы пишете в ассемблере и не , используя библиотеку времени выполнения C, тогда вы можете вызывать точку входа как хотите.Вы сообщаете компоновщику, как называется точка входа, используя параметр командной строки gcc -Wl,--entry=<symbol> или директиву ENTRY в сценарии компоновщика.Компоновщик записывает адрес этой точки входа в исполняемый файл.

Если вы используете библиотеку времени выполнения C, то точка входа в исполняемом файле должна быть точкой входабиблиотека времени выполнения C, чтобы она могла выполнять инициализацию.Эта точка входа обычно называется crt0.Когда crt0 завершает инициализацию, он вызывает main, поэтому в этом случае вы не можете изменить имя.

...