Привет, я пытаюсь написать простую программу приветствия в сборке и скомпилировать ее в файл .o, а затем связать ее со стандартной библиотекой C., чтобы создать .exe, чтобы я мог просматривать разборки для «puts» в моей системе с использованием gdb -tui
. Я использую Cygwin со следующими служебными версиями (получил их с as --version && ld --version
). Я пытаюсь сделать все это на Windows 8 x64.Смещение переселения усечено в соответствии с
как версия 2,25
л.д. версии 2,25
test.asm
Я видел несколько стандартов сборки в Интернете во время обучения сборки x86. Я думаю, что я пишу здесь GAS.
.extern puts
_start:
mov $msg, %rdi
call puts
xor %rax, %rax
ret
msg:
.ascii "hello world"
ассемблер
Я могу собрать выше файла не проблема, утилита as
не дает мне предупреждение или любые ошибки, вот так, как я называю утилиту as
.
as test.asm -o test.o
линкер
Вот где у меня возникли проблемы, следующая команда, как я думаю, что я должен связать объектный файл со стандартной библиотекой C.
ld test.o -o test.exe -lc
Эта команда производит следующие ошибки, которые я в тупик. Я попытался найти ответ в других сообщениях и через Google, но, возможно, я что-то упустил.
test.o:fake:(.text+0x3): relocation truncated to fit: R_X86_64_32S against `.text`
/usr/lib/libc.a(t-d000957.o):fake:(.text+0x2): undefined reference to `__imp_puts`
/usr/lib/libc.a(t-d000957.o):fake:(.text+0x2): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp_puts`
Если вы хотите использовать библиотеку C, вы должны использовать точки входа 'main' и' gcc' для связи. – Jester
Я попробовал ваше предложение, к сожалению, он дал мне несколько новых ошибок. Вот что я сделал, я заменил '_start' на' main' и заменил 'ld test.o -o test.exe -lc' на' gcc test.o -o test.exe'. Это привело к следующим ошибкам: «Перемещение усечено для соответствия: R_X86_64_32S против« .text »libcygwin.a (libcmain.o): В функции« main »:', '/libcmain.c:39: неопределенная ссылка на WinMain','/libcmain.c: 39 :(text.startup + 0x7f): перемещение усечено для соответствия: R_X86_64_PC32 против неопределенного символа «WinMain», 'collect2: error: ld возвращено 1 статус выхода'. – v3nd3774
Тогда, очевидно, cygwin требует 'WinMain', поэтому попробуйте это. – Jester