2011-06-12 2 views
15

FreeBSD 컴퓨터에서 런타임시 libFoundation.so를 찾아야하는 바이너리 "CeeloPartyServer"가 있습니다. 둘 다 같은 디렉토리에 있습니다. 나는 링커 플래그 "-rpath = $ ORIGIN"을 사용하여 (다른 플랫폼에서 크로스 컴파일러를 사용하여) CeeloPartyServer를 컴파일한다.

 
> readelf -d CeeloPartyServer |grep -i rpath 
0x0000000f (RPATH)      Library rpath: [$ORIGIN] 
> ls 
CeeloPartyServer Contents  Foundation.framework libFoundation.so 
> ./CeeloPartyServer 
/libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer" 

실행하려고하면 왜 라이브러리가 없습니다. 정확한 링커 라인은 -lm -lmysql -rpath = $ ORIGIN입니다. 필자는 readelf 분석이 실제로 라이브러리 rpath가 $ ORIGIN으로 설정되어 있다는 것을 보여주기 때문에 \ $ 등의 것을 벗어날 필요가 없다고 확신합니다. 내가 뭘 놓치고 있니?

답변

32

gcc와 binutils를 사용하고 있다고 가정합니다.

당신이

readelf -d CeeloPartyServer | grep ORIGIN 

을 할 경우 당신은 당신이 위에있는 RPATH 라인을 다시 얻어야한다, 그러나 당신은 또한 플래그에 대한 일부 항목을 볼 수 있습니다. 다음은 내가 만든 라이브러리에서 온 것입니다.

0x000000000000000f (RPATH)    Library rpath: [$ORIGIN/../lib] 
0x000000000000001e (FLAGS)    ORIGIN 
0x000000006ffffffb (FLAGS_1)   Flags: ORIGIN 

당신이 FLAGS 항목의 어떤 종류가 표시되지 않는 경우, 당신은 아마 기원 처리를 요구하는 등의 객체를 표시하기 위해 링커를 말하지 않았다. binutils ld를 사용하면 -z origin 플래그를 전달하면됩니다.

gcc를 사용하여 링크를 구동하는 것으로 추측됩니다. 따라서 gcc 링크 라인에 -Wl,-z,origin을 추가하여 컴파일러를 통해 플래그를 전달해야합니다.

+0

귀하의 모든 가정이 올바른지를 제공하는 경우 chrpath와 \ $의 \의 $ 원점을 사용하는 경우. 나는 -z origin 플래그를 사용하지 않고 어디서나 문서화 된 것을 본 적이 없다. 그 문제가 해결되는지 여부를 알려줍니다. – Nektarios

10

링커가보기 전에이 플래그가 통과하는 레이어 수에 따라 $$ORIGIN 또는 \$$ORIGIN을 사용해야 할 수도 있습니다. readelf$ORIGIN/../lib 또는 이와 유사한 RPATH 헤더를 보여줄 때 바로 알 수 있습니다. 여분의 $와 백 슬래시는 $가 체인의 다른 도구에 의해 처리되는 것을 막기위한 것입니다. $ \ ORIGIN \

+4

RPATH에 익숙하지 않은 다른 사람들 (예 : 나 자신과 같은)을 명확히하기 위해서 : LDFLAGS = "- Wl, -rpath, '\ $ \ $ ORIGIN'-Wl, -z, origin" '; 'echo $ LDFLAGS'는'-Wl, -rpath, '$$ ORIGIN -Wl, -z, origin'을 줄 것입니다. ('$$'를 가진 Makefile 매직이 있습니다.) – kevinarpe

+0

'readelf -d'를 사용하여 관련 헤더 또는'chrpath'를 봅니다. – Richard

0

당신이 LDFLAGS

에 직접