DSO 란 무엇입니까?
는 DSO는 동적 공유가 공식적으로 shared library, 이하 객체입니다.
숨겨진 기호 란 무엇입니까?
심볼은 심볼이 숨겨 숨겨진 결합 예컨대 컴파일되었는지 (기능 또는 데이타 객체의 이름, 즉) 선언 제 (특정 GCC) 당 :
int x __attribute__ ((visibility ("hidden")));
경우 x
하나 DSO 정의되어, 동적 링크는 다른 DSO에서이를 참조 할 수있다. 링커는 x
(static
이 아님)을 볼 수 있지만, 동적 인 링크에는 을 사용할 수 없습니다. 문서 here
숨겨진 경우 어떻게 참조 할 수 있습니까?
경고 할 내용이 아닙니다. 예 : linktime 경고 :
이
/usr/lib/libc_nonshared.a(stat.oS에서 '통계')가 DSO
에 의해 참조되는 숨겨진 심볼이 알려주는
이 연결의 DSO가 참조하는 심볼 stat
및 stat
의 정의는 링커가 /usr/lib/libc_nonshared.a
, 에 있지만 (분명히) 해당 정의가 해당 DSO를 참조하는 DSO에없고이며 숨겨져 있기 때문에 해당 DSO에서 참조 할 수 없습니다.
문제 DSO가 올바르게 작성되지 않았기 때문에이 문제가 발생합니다. 을 DSO로 사용하십시오. this example 을 참조하고 솔루션의 후속 조치를 따르십시오.숨겨진 기호가 이미 일부 DSO에 의해 참조되는 경우
영업 이익의 followups
계속, 왜 문제가 DSO 함께?
링커
은 말하고있다 :
이
DSO를 X
심볼 S
에 대한 참조를 포함합니다. S
가 Y
에 결합 숨겨져있다 (즉, 런타임에서 ) 때문에 심볼 S
의 정의가 다른 링크 모듈 Y
, 찾을 수 있지만, 그 정의는 X
동적의 기준을 만족시키기 위해 이용 가능하지 않을 것이다.
이 문제는 비공유 객체와 함께 나타남 [...] [but] 나는 비공유 객체에서 이러한 심볼을 명시 적으로 숨기지 않습니다.
비공유 개체에 숨겨진 기호를 명시 적으로 표시하지 않았을 수 있습니다. 구성 방법에 따라 은 명시 적으로 으로 표시하지 않는 한 기본적으로 숨겨져 있습니다..
비공유 객체가 libnonshared.a
이고 숨겨진 심볼이 foo
이라고 말해보세요. 실행
objdump -t libnonshared.a
가 libnonshared.a
의 기호에 대한 정보를 얻을 수 있습니다. 출력에서 foo
에 대한 항목을 찾으십시오. 태그 .hidden
이 포함되어 있습니까? - 예 : 이 동적 연결에 대한 숨겨진 하지만 -
0000000000000000 g F .text 000000000000000b .hidden foo
이 항목은 foo
글로벌 기호 (링커를 볼 수있다 그 이유는 g
표시) 인 것을 말한다.
이 경우 밝혀지면 libnonshared.a
의 빌드를 수정하여 foo
을 숨기지 않아야합니다. 그렇지 않다면 나는 뒤죽박죽이다.
DSO = 동적 공유 개체 –