2013-10-05 1 views
0

나는 간단한 ASM 파일이 연결하려고 할 때 :링커 출력 '재배치 맞게 잘립니다 : R_X86_64_32'을 yasm 조립 프로그램

$ yasm -f elf64 -g dwarf2 -l my.lst my.asm 

링킹 일부를 반환 yasm이 확인 작업에

$ cat my.asm 
    segment .text 
    global _start 

_start: 
     mov eax,1 
     mov ebx,5 
     int 0x80 

조립을 출력 :

$ ld -o my my.o 
my.o:(.debug_aranges+0x6): relocation truncated to fit: R_X86_64_32 against `.debug_info' 
my.o:(.debug_info+0x6): relocation truncated to fit: R_X86_64_32 against `.debug_abbrev' 
my.o:(.debug_info+0xc): relocation truncated to fit: R_X86_64_32 against `.debug_line' 

그러나 실행 파일이 만들어지지 않습니다.

내 환경은 다음과 같습니다

$ yasm --version 
yasm 1.2.0 

$ ld --version 
GNU ld (GNU Binutils) 2.23.52.20130604 

$ uname -a 
CYGWIN_NT-6.1 MYHOST 1.7.25(0.270/5/3) 2013-08-31 20:37 x86_64 Cygwin 

코드 조각 및 조립이/연결 방법이 책에서 온이 작동하지 않는 이유에 Introduction to 64bit Intel Assembly Language Programming

모든 포인터가 이해할 수있을 것이다.

+0

* 정확한 * 동일한 상황이 아니더라도 관련성이 있습니다. http://www.technovelty.org/c/relocation-truncated-to-fit-wtf.html 또한 '-a' 및 '-m' 옵션을'yasm'에 지정합니다. '-f'는 객체 형식만을 설정하기 때문에 아마'yasm'에게 코드를 64 비트로 만들어야 할 것입니다. – us2012

+1

오류가 .debug 섹션에있는 것 같습니다. '-g' 스위치없이 조립하면 어떻게됩니까? –

+0

'-g' 스위치를 놓으면 링크가 잘됩니다. 그러나 바이너리를 실행하면 세그먼트 화 오류가 발생합니다. 이 [link] (http://stackoverflow.com/questions/17132781/segmentation-fault-when-run-hello-s-by-gnu-assembler-in-cygwin)는 cygwin이 리눅스 타입 호출에 문제가 있음을 암시합니다. –

답변

0

Linux 시스템 호출을 사용하는 Cygwin 바이너리는 Windows에서 실행할 수 없습니다. cygwin을 통해서도 가능합니다. 자세한 내용은 this answer을 참조하십시오.

1

분명히 32 비트 코드 ("int 0x80")를 작성하고 있지만 64 비트 코드 ("-f elf64")로 컴파일/어셈블합니다.

코드를 32 비트 코드로 어셈블해야합니다.

+0

코드 및 어셈블리/링크 단계는 [64 비트 인텔 어셈블리 언어 프로그래밍 소개] (http://www.amazon.co.uk/Introduction-Intel-Assembly-Language-Programming/dp/1466470038)에서 유래되었습니다. ( –