2013-01-19 2 views
9

는 헬로 월드 C 프로그램을 고려gcc가 기본적으로 ld에 전달하는 명령 줄 옵션을 결정하는 방법은 무엇입니까? 내가 전화하면</p> <pre><code>#include "stdio.h" int main() { printf("Hello, World!n"); } </code></pre> <p>:</p> <p><strong>에서는 hello.c</strong> :

$ gcc -c hello.c -o hello.o 

그것은이 ELF 재배치 파일을 hello.o를 생성합니다

다음 전화 문의 :

$ gcc hello.o -o hello   [1] 

는 LD와 hello.o 링크하고 ELF 실행 파일을 안녕 그러나 내가 LD 직접 [2] 대신 [1]의 호출하는 경우

생성 할 것이다 : 나는 이러한 오류를 얻을

$ ld hello.o -o hello    [2] 

를 :

/usr/bin/ld.bfd.real: warning: cannot find entry symbol _start 
test.c:(.text+0xa): undefined reference to `puts' 

gcc 필수 (예를 들어 C 라이브러리를 링크하기 위해) ld에 다른 옵션을 전달해야한다.

정확하게 명령 줄 gcc가 명령 [1]에서 ld로 전달되는 것을 정확하게 결정할 수 있습니까?

답변

15

예, gcc -v hello.o -o hello을 사용하면 링크 줄을 가져올 수 있습니다. collect2ld 단지의 별칭입니다

/usr/lib/gcc/x86_64-linux-gnu/4.4.5/collect2 
--build-id 
--eh-frame-hdr 
-m elf_x86_64 
--hash-style=gnu 
-dynamic-linker 
/lib64/ld-linux-x86-64.so.2 
-o hello 
-z relro 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib 
-L/lib/../lib 
-L/usr/lib/../lib 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../.. -L/usr/lib/x86_64-linux-gnu 
hello.o 
-lgcc 
--as-needed -lgcc_s --no-as-needed 
-lc 
-lgcc 
--as-needed -lgcc_s --no-as-needed 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtend.o 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o 

하는 것으로 내 우분투 시스템에서 귀하의 예를 들어, 나는 (가독성을 위해 여러 줄 수 편집) 링크 라인을 얻을.

+1

내 우분투에서 보이는 것 같습니다. 12.10 64 상자'collect2'는'ld'의 간단한 별칭이 아닙니다. 'collect2'는 실행 가능한 반면'ld'는 perl 스크립트 인'hardened-ld '에 대한 심볼릭 링크 인'ld.bfd'에 대한 sym 링크입니다. 무슨 일이 일어나고 있는지 전혀 몰라. –

+1

죄송합니다. 리터럴 별칭을 의미하지 않습니다. 대신에'ld' 명령으로 같은 명령을 실행하면 같은 결과를 얻을 수 있습니다. 문서 : http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gccint/Collect2.html –

+0

'collect2'와'ld'의 차이점은 무엇입니까? gccint를 읽은 후 쉽게 이해할 수 없었습니다. –