2016-06-06 1 views
0

AA.so가 포함 된 신청서가 있습니다. AA.so는 내부적으로 CC.a 버전 1을 포함합니다.응용 프로그램에 동일한 정적 라이브러리의 다른 버전을 포함시키는 방법은 무엇입니까?

이제 BB.so를 다른 응용 프로그램에 포함시켜야합니다. BB.so에는 CC.a 버전 2도 포함되어 있습니다.

나는 이러한 라이브러리 중 어떤 소스 코드도 가지고 있지 않습니다.

내 질문은 - AA.so에서 함수 호출이 CC.a 버전 1로 이동하고 BB.so에서 호출이 CC.a 버전 2로 이동하는 것을 확인하는 방법은 무엇입니까?

답변

0

AA.so에서 함수 호출이 CC.a 버전 1로 이동하고 BB.so에서 호출이 CC.a 버전 2로 이동하는 것을 확인하는 방법은 무엇입니까? 당신은 할 수

: 만들기 확실히 독립적 인 방식으로 AA.soBB.so 구축을 포함, 당신은 그들을 다시 수 없습니다. 당신이 할 수있는 일

BB.so에 대한 dlopen("AA.so", RTLD_LAZY|RTLD_LOCAL) 및이를 이용한 런타임 라이브러리를로드하여이 작품을 만들기 위해을 시도하고 라이브러리가 서로 밟지 않는 것을 희망 입니다.

이론상으로는 (RTLD_LOCAL이 중요 함) 작동해야합니다. 실제로 이것은 여전히 ​​깨질 수있는 많은 방법이 있습니다. 당신은 매우 위험한 땅으로 모험하고 있습니다.

오늘은 작동하지만 공유 라이브러리가 업데이트되면 중단 될 수 있습니다. 은 라이브러리 공급자와 협력하여 여러 가지 호환되지 않는 버전 혼란에서 벗어나야합니다.

업데이트 :

나는 그들이 자체에 포함되어 공유 객체가 다른 어떤과 그 의미에 의존하지 않는 생각합니다.

"다른 것에 의존하지 마십시오"부분은 필요하지만 충분하지 않습니다.

일반적으로 공유 라이브러리 은 모든 글로벌 기능과 데이터를에 내 보냅니다. CC.a에 글로벌 함수 foo이 포함되어 있다고 가정합니다. 이 함수의 버전 1과 2가 호환되지 않으며 foo인 경우 AA.soBB.so에서을 모두 내 보낸 것으로 가정합니다. 이 경우 먼저로드 된 라이브러리가 우선적으로 적용됩니다. AA.so이 먼저로드되면 BB.so에서 foo으로의 호출이 AA.so의 정의로 해석되고 프로그램이 상태를 손상 시키거나 충돌합니다.

그렇지 않은지 확인하려면 AA.soBB.sonm -D을 실행하고이 라이브러리에서 내 보낸 심볼의 교차가 비어 있는지 확인해야합니다. 비어 있지 않으면 두 정의가 호환되는지 확인해야합니다.

+0

@Employed Russian!그러나 나는 공유 된 사물이 다른 것에 의존하지 않는다고 믿는다. 그런 의미에서 그들은 공유 된 사물이다. 이상적으로, AA.so 버전은 CC.a 버전 1과 BB를 사용해야합니다. 따라서 CC.a 버전 2를 사용해야합니까? – MayurK

+0

@ KM2 답변 됨. –

관련 문제