2011-10-09 3 views
11

위치가 gcc 코드로 하드 ​​코드되어 있습니까? 아니면 gcc가 as을 호출합니까? PATH 변수에 as 위치가 있어야합니까?gcc는 as, ld 및 다른 binutils 실행 파일을 어떻게 찾습니까?

그리고 후자의 경우 어떻게 두 개의 완전히 분리 된 gcc 툴 체인을 만들 수 있습니까? 내 말은, 을 gcc-A으로 호출하고 as-Aas-B을 모두 as이라면 gcc-Bas-B을 호출하게하려면 어떻게해야합니까?

답변

10

일부 경로 (예 : cc1)가 컴파일되고 기타 (예 : as)는 $ PATH에서 정상 조회를 사용합니다. 이는 GCC가 구성된 옵션에 따라 다를 수 있습니다.

strace으로 실행하고 exec|stat을 사용하여 그루핑을하면 쉽게 알 수 있습니다. 당신이 찾고의 부족에서 볼 수 있듯이, 컴파일 된 경로로 CC1를 호출입니다

$ strace -f gcc foo.c -o foo |& grep exec 
⋮ 
[pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", … 

. 그것도 $ PATH에 없습니다.

[pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory) 
[pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory) 
[pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0 

이는 $ PATH에서 as을 찾고 있습니다. 각 위치를 $ PATH에 순서대로 시도했기 때문에 알 수 있습니다.

stat와 exec만으로도 많은 strace 출력을 생략했습니다. 여러 페이지가 길어졌습니다.

gcc -v을 실행하면 (configure 행의 일부로) 컴파일 된 경로 중 일부가 표시됩니다.

+0

대단히 감사합니다. 어떤 구성 옵션이 최종 동작을 정의하는지 알고 있습니까? gcc가/​​my/path/as와 my/path/ld만을 사용하도록 제한 할 수있는 방법이 있습니까? –

+1

@MichalisVichos : 아마도 configure 플래그'--with-as =/my/path/as'가 그렇게 할 것입니다. configure 설명서가 나타나면 http://gcc.gnu.org/install/configure.html에서 (또는 물론 ./configure --help'와 함께) 사용할 수 있습니다. – derobert

1

은위한 임시 옵션이있다 : GCC 문서를 인용 -B * 접두사 * :

각 서브 프로그램이 실행되기 위해서는, 어떤 경우 컴파일러 드라이버가 먼저 -B 접두사를 시도합니다. 그 이름을 찾을 수 없거나 -B를 지정하지 않은 경우 드라이버는/usr/lib/gcc/및/usr/local/lib/gcc/인 두 개의 표준 접두어 인 을 시도합니다. [...]

1

또한 함께 GCC 검색 경로를 조회 할 수 있습니다

gcc -print-search-dirs | grep -E '^programs' | tr ':' '\n' 

샘플 출력 :

programs 
=/usr/lib/gcc/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/ 
/usr/lib/gcc/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/ 
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/ 
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/ 

특정 프로그램 :

gcc -print-prog-name=cc1 

샘플 출력 :

/usr/lib/gcc/x86_64-linux-gnu/6/cc1