[Assembly] GCC 링크 도중 에러가 뜨네요
제 컴퓨터 환경은 윈도우즈7 64비트에
cygwin으로 vi에디터에서 소스작성하고, nasm과 gcc를 사용해 컴파일하고 있습니다.
%include "asm_io.inc" ; 이 파일은 first.asm파일과 동일 폴더에 넣어두었고, driver.c와 asm_io.o도 함께 넣어 두었습니다. segment .data prompt1 db "Enter a number: ", 0 prompt2 db "Enter another number: ", 0 outmsg1 db "You entered ", 0 outmsg2 db " and ", 0 outmsg3 db ", the sum of these is ", 0 segment .bss input1 resd 1 input2 resd 2 segment .text global _asm_main _asm_main: enter 0, 0 pusha mov eax, prompt1 call print_string call read_int mov [input1], eax mov eax, prompt2 call print_string call read_int mov [input2], eax mov eax, [input1] add eax, [input2] mov ebx, eax dump_regs 1 dump_mem 2, outmsg1, 1 mov eax, outmsg1 call print_string mov eax, [input1] call print_int mov eax, outmsg2 call print_string mov eax, [input2] call print_int mov eax, outmsg3 call print_string mov eax, ebx call print_int call print_nl popa mov eax, 0 leave ret
저자는 문서 내에서
nasm -f coff first.asm
gcc -o first first.o driver.c asm_io.o
와 같이 하면 실행 가능한 프로그램이 된다고 하는데..
gcc에서 링크할 때 에러가 뜨거든요...
에러는 아래와 같습니다...
/usr/lib/gcc/x86_64-pc-cygwin/5.3.0/../../../../x86_64-pc-cygwin/bin/ld: i386 architecture of input file 'first.o' is incompatible with i386:x86-64 output
/usr/lib/gcc/x86_64-pc-cygwin/5.3.0/../../../../x86_64-pc-cygwin/bin/ld: i386 architecture of input file 'asm_io.o' is incompatible with i386:x86-64 output
driver.o:driver.c:<.text+0xe>: undefined reference to 'asm_main'
driver.o:driver.c:<.text+0xe>: relocation truncated to fit: R_X86_64_PC32 against undefined symbol 'asm_main'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: undefined reference to '_scanf'
asm_io.o:asm_io.asm:<.text+0x10>: more undefined ..................... 등등과 같습니다...
마지막에
collect2: error: ld returned 1 exit status
Dr. paul carter 의 assembly(이재범 번역) 을 공부하고 있는데;;실습해보고 싶은데 안되는 이유가 뭔지...
눈으로만 책을 보려니 조금 힘들어서 혹시 이 문제에 대해서 잘 알고 있으신 분 계신가요?
첨부 | 파일 크기 |
---|---|
cygwin-ex.zip | 29.35 KB |
성의있게 올리신 질문인데 답이 없었네요. 이미
성의있게 올리신 질문인데 답이 없었네요.
이미 50일쯤 되어서 와보실지 모르겠지만..
NASM으로 어셈블한 asm_io.o 와 first.o 파일은 32-bit 바이너리인데
gcc로는 64-bit 모드로 컴파일/링크하고 있어서 문제가 생기는 것입니다.
지금 쓰시는 환경은 64-bit cygwin인데,
cygwin.com에서 32-bit 모드인 cygwin.exe를 받아 설치하고 해보시면 될겁니다.
cygwin 32-bit/64-bit 환경은 한 시스템에 공존할 수 있으니 부담없이 설치할 수 있습니다.
빌드할때는 아래와 같이 -f win32 옵션을 주고 어셈블해야 동작하네요.
----
32-bit cygwin 설치하는 대신, 어셈블리 소스를 64-bit 어셈블해도 될거라 여길 수도 있겠지만
그러려면 어셈블리 코드를 많이 수정해야 하는 것 같습니다.
( nasm -f win64 asm_io.asm 해보면 알 수 있습니다 )
그리고, cygwin64 환경에서 gcc -m32 옵션으로 32-bit 빌드하는 방법도 생각해볼 수 있겠지만
잠시 이런저런 시도를 해봐도 링크까지는 되는데 제대로 동작은 안 되네요.
그냥 cygwin 32-bit 환경 설치하고 하면 잘 됩니다.
댓글 달기