[Assembly] GCC 링크 도중 에러가 뜨네요

scale330의 이미지

제 컴퓨터 환경은 윈도우즈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(이재범 번역) 을 공부하고 있는데;;실습해보고 싶은데 안되는 이유가 뭔지...
눈으로만 책을 보려니 조금 힘들어서 혹시 이 문제에 대해서 잘 알고 있으신 분 계신가요?

File attachments: 
첨부파일 크기
Package icon cygwin-ex.zip29.35 KB
chanik의 이미지

성의있게 올리신 질문인데 답이 없었네요.
이미 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 옵션을 주고 어셈블해야 동작하네요.

$ nasm -f win32 asm_io.asm
$ nasm -f win32 first.asm
$ gcc -o first first.obj driver.c asm_io.obj

----

32-bit cygwin 설치하는 대신, 어셈블리 소스를 64-bit 어셈블해도 될거라 여길 수도 있겠지만
그러려면 어셈블리 코드를 많이 수정해야 하는 것 같습니다.
( nasm -f win64 asm_io.asm 해보면 알 수 있습니다 )

그리고, cygwin64 환경에서 gcc -m32 옵션으로 32-bit 빌드하는 방법도 생각해볼 수 있겠지만
잠시 이런저런 시도를 해봐도 링크까지는 되는데 제대로 동작은 안 되네요.

그냥 cygwin 32-bit 환경 설치하고 하면 잘 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.