32비트 gcc를 64비트 gcc로 사용하려는데 실행이 안되네요.

Submitted by westporch on 2012.12.19.(Wed) - 22:27

지금 제가 사용하는 gcc 버전은 4.4.5입니다.

gcc는 32비트를 쓰고 있고 데비안은 64비트를 쓰고 있습니다.

 

// test.c
#include <stdio.h>

int main(void)
{
	char *pt = NULL;
	printf("sizeof(pt) = %d\n", sizeof(pt));

	return 0;
}

위 소스를 64비트로 컴파일 해보려고 했습니다.

gcc를 컴파일 할 때 -m64 옵션을 붙여주면 된다고 해서

root@localhost:/home/westporch/c# gcc -m64 -o test test.c
In file included from /usr/include/features.h:378,
                 from /usr/include/stdio.h:28,
                 from test.c:1:
/usr/include/gnu/stubs.h:9:27: error: gnu/stubs-64.h: 그런 파일이나 디렉터리가 없습니다

 

위와 같이 -m64 옵션을 줘서 컴파일을 시도했지만

stubs-64.h 파일이 없다고 해서 gcc-multilib를 설치했습니다.

root@localhost:/home/westporch/c# apt-get install gcc-multilib
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다
상태 정보를 읽는 중입니다... 완료
다음 패키지를 더 설치할 것입니다:
  gcc-4.4-multilib lib64gcc1 lib64gomp1 libc6-amd64 libc6-dev-amd64
제안하는 패키지:
  lib64mudflap0
다음 새 패키지를 설치할 것입니다:
  gcc-4.4-multilib gcc-multilib lib64gcc1 lib64gomp1 libc6-amd64 libc6-dev-amd64
0개 업그레이드, 6개 새로 설치, 0개 제거 및 1개 업그레이드 안 함.
8,488 k바이트 아카이브를 받아야 합니다.
이 작업 후 22.0 M바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까 [Y/n]? y
받기:1 http://ftp.kr.debian.org/debian/ squeeze/main libc6-amd64 i386 2.11.3-4 [4,180 kB]
받기:2 http://ftp.kr.debian.org/debian/ squeeze/main libc6-dev-amd64 i386 2.11.3-4 [2,032 kB]
받기:3 http://ftp.kr.debian.org/debian/ squeeze/main lib64gcc1 i386 1:4.4.5-8 [44.9 kB]
받기:4 http://ftp.kr.debian.org/debian/ squeeze/main lib64gomp1 i386 4.4.5-8 [25.3 kB]
받기:5 http://ftp.kr.debian.org/debian/ squeeze/main gcc-4.4-multilib i386 4.4.5-8 [2,205 kB]
받기:6 http://ftp.kr.debian.org/debian/ squeeze/main gcc-multilib i386 4:4.4.5-1 [820 B]
내려받기 8,488 k바이트, 소요시간 3초 (2,588 k바이트/초)
전에 선택하지 않은 libc6-amd64 패키지를 선택합니다.
(데이터베이스 읽는중 ...현재 131116개의 파일과 디렉터리가 설치되어 있습니다.)
libc6-amd64 패키지를 푸는 중입니다 (.../libc6-amd64_2.11.3-4_i386.deb에서) ...
전에 선택하지 않은 libc6-dev-amd64 패키지를 선택합니다.
libc6-dev-amd64 패키지를 푸는 중입니다 (.../libc6-dev-amd64_2.11.3-4_i386.deb에서) ...
전에 선택하지 않은 lib64gcc1 패키지를 선택합니다.
lib64gcc1 패키지를 푸는 중입니다 (.../lib64gcc1_1%3a4.4.5-8_i386.deb에서) ...
전에 선택하지 않은 lib64gomp1 패키지를 선택합니다.
lib64gomp1 패키지를 푸는 중입니다 (.../lib64gomp1_4.4.5-8_i386.deb에서) ...
전에 선택하지 않은 gcc-4.4-multilib 패키지를 선택합니다.
gcc-4.4-multilib 패키지를 푸는 중입니다 (.../gcc-4.4-multilib_4.4.5-8_i386.deb에서) ...
전에 선택하지 않은 gcc-multilib 패키지를 선택합니다.
gcc-multilib 패키지를 푸는 중입니다 (.../gcc-multilib_4%3a4.4.5-1_i386.deb에서) ...
libc6-amd64 (2.11.3-4) 설정하는 중입니다 ...
libc6-dev-amd64 (2.11.3-4) 설정하는 중입니다 ...
lib64gcc1 (1:4.4.5-8) 설정하는 중입니다 ...
lib64gomp1 (4.4.5-8) 설정하는 중입니다 ...
gcc-4.4-multilib (4.4.5-8) 설정하는 중입니다 ...
gcc-multilib (4:4.4.5-1) 설정하는 중입니다 ...

 

gcc-multilib를 설치하고 64비트로 컴파일을 시도했습니다.

root@localhost:/home/westporch/c# gcc -m64 -o test test.c
root@localhost:/home/westporch/c# ./test
bash: ./test: cannot execute binary file
root@localhost:/home/westporch/c# ls
test  test.c



그런데 바이너리 파일을 실행할 수 없다고 하네요.
 





gcc가 컴파일 할 때 Linking 과정에서 문제가 있는것 같아서

-v 옵션을 주고 컴파일을 해봤습니다.

root@localhost:/home/westporch/c# gcc -v -m64 -o test test.c
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-8)
COLLECT_GCC_OPTIONS='-v' '-m64' '-o' 'test' '-mtune=generic'
 /usr/lib/gcc/i486-linux-gnu/4.4.5/cc1 -quiet -v -imultilib 64 test.c -quiet -dumpbase test.c -m64 -mtune=generic -auxbase test -version -o /tmp/ccBP33C2.s
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/i486-linux-gnu/4.4.5/../../../../i486-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i486-linux-gnu/4.4.5/include
 /usr/lib/gcc/i486-linux-gnu/4.4.5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C (Debian 4.4.5-8) version 4.4.5 (i486-linux-gnu)
	compiled by GNU C version 4.4.5, GMP version 4.3.2, MPFR version 3.0.0-p3.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 0192d925385d4e6642a93c63f245f907
COLLECT_GCC_OPTIONS='-v' '-m64' '-o' 'test' '-mtune=generic'
 as -V -Qy --64 -o /tmp/ccDnXfBL.o /tmp/ccBP33C2.s
GNU assembler version 2.20.1 (i486-linux-gnu) using BFD version (GNU Binutils for Debian) 2.20.1-system.20100303
COMPILER_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.5/:/usr/lib/gcc/i486-linux-gnu/4.4.5/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.5/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.5/:/usr/lib/gcc/i486-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.5/64/:/usr/lib/gcc/i486-linux-gnu/4.4.5/64/:/usr/lib/gcc/i486-linux-gnu/4.4.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/i486-linux-gnu/4.4.5/:/usr/lib/gcc/i486-linux-gnu/4.4.5/:/usr/lib/gcc/i486-linux-gnu/4.4.5/../../../:/lib/:/usr/lib/:/usr/lib/i486-linux-gnu/
COLLECT_GCC_OPTIONS='-v' '-m64' '-o' 'test' '-mtune=generic'
 /usr/lib/gcc/i486-linux-gnu/4.4.5/collect2 --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=both -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o test /usr/lib/gcc/i486-linux-gnu/4.4.5/../../../../lib64/crt1.o /usr/lib/gcc/i486-linux-gnu/4.4.5/../../../../lib64/crti.o /usr/lib/gcc/i486-linux-gnu/4.4.5/64/crtbegin.o -L/usr/lib/gcc/i486-linux-gnu/4.4.5/64 -L/usr/lib/gcc/i486-linux-gnu/4.4.5/64 -L/usr/lib/gcc/i486-linux-gnu/4.4.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/i486-linux-gnu/4.4.5 -L/usr/lib/gcc/i486-linux-gnu/4.4.5 -L/usr/lib/gcc/i486-linux-gnu/4.4.5/../../.. -L/usr/lib/i486-linux-gnu /tmp/ccDnXfBL.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i486-linux-gnu/4.4.5/64/crtend.o /usr/lib/gcc/i486-linux-gnu/4.4.5/../../../../lib64/crtn.o
root@localhost:/home/westporch/c# 

컴파일 과정을 보면 Preprocessing ---> Compilation ---> Assemble ---> Linking 과정을 거쳐서

컴파일이 정상적으로 완료된것 같은데 어디가 문제인지 잘 모르겠습니다.

 

아시는 분은 도와주세요~