2014-05-16 1 views
21

일부 공유 라이브러리를 g ++와 연결하는 데 문제가 있습니다. 나는 특정 문제에 대한 몇 가지 관련 질문을 읽은숨겨진 기호가 DSO에 의해 참조되는 것과 정확히 무슨 의미입니까?

hidden symbol XXX in YYY is referenced by DSO /usr/lib/... 

,하지만 난 전부 이해하려면 -이 경고의 의미 무엇을하고 원인이 무엇인가 : 그것은 나에게 같은 경고를 제공

  1. DSO 란 무엇입니까?
  2. 숨겨진 기호 란 무엇입니까?
  3. 숨겨진 경우 어떻게 참조 할 수 있습니까?
+0

DSO = 동적 공유 개체 –

답변

19

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가 참조하는 심볼 statstat의 정의는 링커가 /usr/lib/libc_nonshared.a, 에 있지만 (분명히) 해당 정의가 해당 DSO를 참조하는 DSO에없고이며 숨겨져 있기 때문에 해당 DSO에서 참조 할 수 없습니다.

문제 DSO가 올바르게 작성되지 않았기 때문에이 문제가 발생합니다. 을 DSO로 사용하십시오. this example 을 참조하고 솔루션의 후속 조치를 따르십시오.숨겨진 기호가 이미 일부 DSO에 의해 참조되는 경우

영업 이익의 followups

계속, 왜 문제가 DSO 함께?

링커

은 말하고있다 :

DSO를 X 심볼 S에 대한 참조를 포함합니다. SY에 결합 숨겨져있다 (즉, 런타임에서 ) 때문에 심볼 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을 숨기지 않아야합니다. 그렇지 않다면 나는 뒤죽박죽이다.

+0

답안의 마지막 부분을 이해하지 못합니다. 숨겨진 기호가 이미 일부 DSO에서 참조 된 경우 DSO에 문제가있는 이유는 무엇입니까? - 사실, 문제가 비공유 객체와 함께 존재한다는 것을 확인할 수 있습니다. DSO는 다른 이름으로 같은 심볼을 정의합니다. DSO는 다른 심볼을 다른 곳에서 제공합니다. 또한, 나는 비공유 객체에서 심볼을 명시 적으로 숨기지 않습니다. –

관련 문제