2011-12-22 3 views
3

저는 64 비트 우분투 운영 시스템을 가지고 있으며 32 비트 어셈블리를 배우고 있습니다.리눅스에서 C와 어셈블리 (32 비트 코드)를 결합하십시오. 64 비트

square.s : 나는이 두 파일을 컴파일하려고

#square.s 

.section .text 
.globl sqr 
.type sqr, @function 
sqr: 
    pushl %ebp 
    movl %esp, %ebp 
    movl 8(%ebp), %eax 
    imull %eax, %eax 
    popl %ebp 
    ret 

main.c를 내 32 비트 가상 머신에

//main.c 
#include <stdio.h> 
extern long sqr(long); 
int main(int argc, char* argv[]) 
{ 
    long squared = sqr(10); 
    printf("%lu\n", squared); 
    return 0; 
} 

나는이 명령

gcc main.c square.s -o test 
로 컴파일

그리고 효과가있었습니다. 내가 가지고있는 문제는 필자의 64 비트 머신에서이 파일들을 컴파일하고 싶다는 것이다. 나는이 파일을 컴파일하는 몇 가지 방법을 시도했지만 아무도 작동하지 못했다. 누구나 올바른 방향으로 나를 가리킬 수 있습니까? 이 작업을 수행 할 수있는 옵션이 있습니까? 나는 시도했다 -m32 그러나 그것은 작동하지 않았다. 나는이 수행 할 때

:

In file included from /usr/include/stdio.h:28:0, 
      from main.c:1: 
/usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory 
compilation terminated. 
우분투 GCC-multilib 필요 64 비트에
+1

'gcc -m32 -o test main.c square.s'가 작동합니다. 어떻게 작동하지 않습니까? – AusCBloke

+0

잘 모르겠습니다 ... 다시 확인하겠습니다. –

+0

OT하지만 푸시 앤 팝이 불필요하다고 생각합니다. –

답변

6

컴파일/링크 32 비트 프로그램, 시도 :

sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386 

gcc -m32 -o test main.c square.s 

을 나는이 얻을

그러나 다른 라이브러리를 연결하려고하면 다른 문제가 발생할 수 있습니다.

32-bit chroot environment (즉, 64 비트 우분투에서 32 비트 루트를 실행하는 것)을 사용하면 더 운이 좋을 것입니다.

+0

감사합니다! 그러나 당신이 말한 방식이 나를 위해 일하지 않았습니다. 대신에 나는 단지 "sudo apt-get install gcc-multilib"을 실행했다. –

0

문제가 어셈블리 코드와 상관없이 일반적으로 32 비트 컴파일과 관련이있는 것으로 보입니다. 뭔가 잘못 구성되었을 수 있습니다.

또한 .s 파일 대신 인라인 어셈블리를 사용해 보셨습니까? C와 어셈블리를이 방식으로 통합하는 것이 훨씬 쉽고 컨벤션 세부 정보를 호출하는 것에 대해 걱정할 필요가 없습니다.

관련 문제