Я изучаю сборку с NASM
для класса, который у меня есть в колледже. Я хотел бы связать библиотеку времени выполнения C с ld
, но я просто не могу обернуться вокруг нее. У меня есть машина 64 bit
с Linux Mint
.
Причина, по которой я запутался, заключается в том, что, насколько мне известно, вместо связывания C runtime, gcc
копирует то, что вам нужно в вашу программу. Возможно, я ошибаюсь, поэтому, не стесняйтесь, поправьте меня на это, пожалуйста.
То, что я сделал до этого момента, - это связать его с помощью gcc
. Это создает беспорядок машинного кода, который я не могу выполнить, хотя для небольшой программы, например, для замены rax
с rbx
, что не так хорошо для обучения. (Обратите внимание, что программа работает.)
Я не уверен, что это актуально, но это команды, которые я использую для компиляции и ссылки:
# compilation
nasm -f elf64 swap.asm
# gcc
gcc -o swap swap.o
# ld, no c runtime
ld -s -o swap swap.o
Заранее благодарю вас!
Вывод:
Теперь, когда у меня есть правильный ответ на вопрос, вот несколько вещей, которые я хотел бы упомянуть. Связывание glibc
динамически может быть выполнено, как в ответе Z boson (для 64-битных систем). Если вы хотите сделать это статически, выполните эту ссылку (что я повторно отправляю из ответа Z бозона).
Вот статья, которую опубликовал Jester, о как запускаются программы в Linux.
Чтобы узнать, что делает gcc
, чтобы связать ваш .o
-s, попробуйте эту команду: gcc -v -o swap swap.o
. Обратите внимание, что 'v' означает 'verbose'.
Кроме того, вы должны прочитать это, если вы заинтересованы в 64-битной сборке.
Спасибо за ваши ответы и полезную информацию! Конец речи.