2014-02-06 2 views
2

[일부 어셈블러 | 다른 컴파일러 | 아카이브]를 링커에 직접 보냅니다.컴파일러가 사용하고있는 * 실제 링커 *를 임의의 시스템에서 어떻게 찾을 수 있습니까?

하지만 경로에서 발견 된 ld은 [broken | 실종 | 잘못된 ABI를위한 링크].
가끔은 심지어 ld을 찾을 수 없습니다.

C 컴파일러가 무엇이든간에 실제로 사용되는 링커를 어떻게 찾을 수 있습니까?
[Mac | 리눅스에서 | BSD에서 | 구성 스크립트에서]?

+0

GCC와 연타'-print-프로그 이름 = ld'로 - 나는 ICC에 대해 알고하지 않습니다 . 컴파일러를 호출하여 객체를 연결할 수 있습니다 (소스 없음). –

+0

@BrettHale 사실, '-print-prog-name = ld'이 실제로 트릭을하지 않기 때문에 질문과 답변을 올렸습니다. 예를 들어'gcc -print-prog-name = ld'는 내 시스템에서 'ld'가 아닌'collect2' 래퍼를 호출하기 때문에 단순히 'ld'를 되돌려줍니다. –

+0

Re : '항상 컴파일러를 호출하여 대신'- 사실입니까? 그렇다면 위대한 것입니다,하지만 내가 할 수있는 방법을 알아낼 수없는 몇 가지 옵션이 있습니다. 예를 들어, 컴파일러 프론트 엔드를 통해 객체를 병합하려면 어떻게'ld -r'합니까? –

답변

0

나는 이것을 알아 내야했습니다.
힘든 일 이었기 때문에 나눌 것을 생각했습니다. ,

이 사람 어서, 필요의 방법을

#!/usr/bin/env sh 

# 'main;' is the shortest C program possible (I think.). 
# So it is compiled, linked, and written to /dev/null. 
# So if the linker can't link, this should return 1. 

for link in collect2 ld; do # Order matters, because of GCC. 
echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep -q $link && 
echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep $link | 
sed -e "s|\(.*$link\).*|\1|" -e 's/ //g' -e 's|"||' && break 
done 

# That should work on just about anything, and returns an absolute path, 
# except with ICC. If we want to try to get an absolute path there too, 
# we have to: 

# If 'which' is missing, and it might not have an -s flag. 
which="$(which which >/dev/null 2>&1)" || which=echo 

$which "$(for link in collect2 ld; do 
echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep -q $link && 
echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep $link | 
sed -e "s|\(.*$link\).*|\1|" -e 's/ //g' -e 's|"||' && break 
done)" 

그래서 당신이있을 방금 말한 :

이 주사를하지 않습니다! 그냥, which ld처럼.

정직하고 진정으로 시간 낭비가 많습니다.
ld은 종종 래퍼이므로 그다지 특이하지 않습니다.

#!/usr/bin/env sh 

# On my Mac, nothing too special, I swear. 
# Just a MacBook, Xcode, GCC from Homebrew, and one commercial compiler. 


echo; $which ld; echo "...Not necessarily."; echo 

for CC in cc gcc clang icc; do echo $c: 
    for link in collect2 ld; do 
    echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep -q $link && 
    echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep $link | 
     sed -e "s|\(.*$link\).*|\1|" -e 's/ //g' -e 's|"||' && break 
    done 

    which="$(which which 2>/dev/null 1>&1)" || which=echo 
    $which "$(for link in collect2 ld; do 
    echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep -q $link && 
    echo 'main;' | $CC -v -x c - -o /dev/null -\#\#\# 2>&1 | grep $link | 
    sed -e "s|\(.*$link\).*|\1|" -e 's/ //g' -e 's|"||' && break 
    done)" 
    echo 
done 

반환 :

는 테스트 변합니다 것을 볼 수 있습니다

/usr/bin/ld 
...Not necessarily. 

cc: 
/Applications/Xcode51-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld 
/Applications/Xcode51-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld 

gcc: 
/Users/Shared/usr/local/Cellar/gcc49/4.9-20140119/libexec/gcc/x86_64-apple-darwin13.1.0/4.9.0/collect2 
/Users/Shared/usr/local/Cellar/gcc49/4.9-20140119/libexec/gcc/x86_64-apple-darwin13.1.0/4.9.0/collect2 

clang: 
/Applications/Xcode51-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld 
/Applications/Xcode51-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld 

icc: 
ld 
/usr/bin/ld 
+0

스택 오버플로가 답변을 수락하거나 현상금을 시작해야한다고 알려줍니다. 그래서 나는 여기에 내 대답을 받아 들일 것이다. 그것은 아닙니다 : [질문에 대한 마지막 코멘트] (http://stackoverflow.com/questions/21605720/how-can-i-find-and-test-the-actual-linker-a-compiler-is-using 참조) -on-an-arbitrary # comment32666361_21605720). –