Привет, я пытался написать простую программу hello world на ассемблере и скомпилировать ее в файл .o, а затем связать ее со стандартной библиотекой C, чтобы создать .exe, чтобы я мог просматривать дизассемблирование для «путей» на моем система с использованием gdb -tui
. Я использую Cygwin со следующими версиями утилит (получил их с as --version && ld --version
). Я пытаюсь сделать все это на Windows 8 x64.
как версия 2.25
лд версия 2.25
test.asm
Я видел несколько стандартов сборки в Интернете, изучая сборку x86. Я думаю, что то, что я пишу здесь, это ГАЗ.
.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`
main
иgcc
для компоновки. - person Jester   schedule 30.12.2015_start
наmain
, аld test.o -o test.exe -lc
наgcc test.o -o test.exe
. Это привело к следующим ошибкамrelocation truncated to fit: R_X86_64_32S against '.text' libcygwin.a(libcmain.o): In function 'main':
, `/libcmain.c:39: неопределенная ссылка на WinMain`, `/libcmain.c:39:(.text.startup+0x7f): перемещение усечено, чтобы соответствовать: R_X86_64_PC32 против неопределенного символа 'WinMain' ` , ` collect2: ошибка: ld вернул 1 статус выхода ` . - person v3nd3774   schedule 30.12.2015WinMain
, так что попробуйте. - person Jester   schedule 30.12.2015main
наWinMain
без каких-либо изменений в ошибках в OP. Примечание Похоже, что я могу использоватьgcc test.asm -o test.o -c
для создания объектного файла, я чувствую, что проблема возникает, когда я запускаю его через компоновщикld
. Вы предложили изменитьmain
наWinMain
, верно? - person v3nd3774   schedule 30.12.2015_start
наWinMain
, а также добавьте.global WinMain
для экспорта. - person Jester   schedule 30.12.2015