AA.so에서 함수 호출이 CC.a 버전 1로 이동하고 BB.so에서 호출이 CC.a 버전 2로 이동하는 것을 확인하는 방법은 무엇입니까? 당신은 할 수
: 만들기 확실히 독립적 인 방식으로 AA.so
및 BB.so
구축을 포함, 당신은 그들을 다시 수 없습니다. 당신이 할 수있는 일
는 BB.so
에 대한 dlopen("AA.so", RTLD_LAZY|RTLD_LOCAL)
및이를 이용한 런타임 라이브러리를로드하여이 작품을 만들기 위해을 시도하고 라이브러리가 서로 밟지 않는 것을 희망 입니다.
이론상으로는 (RTLD_LOCAL
이 중요 함) 작동해야합니다. 실제로 이것은 여전히 깨질 수있는 많은 방법이 있습니다. 당신은 매우 위험한 땅으로 모험하고 있습니다.
오늘은 작동하지만 공유 라이브러리가 업데이트되면 중단 될 수 있습니다. 은 라이브러리 공급자와 협력하여 여러 가지 호환되지 않는 버전 혼란에서 벗어나야합니다.
업데이트 :
나는 그들이 자체에 포함되어 공유 객체가 다른 어떤과 그 의미에 의존하지 않는 생각합니다.
"다른 것에 의존하지 마십시오"부분은 필요하지만 충분하지 않습니다.
일반적으로 공유 라이브러리 은 모든 글로벌 기능과 데이터를에 내 보냅니다. CC.a
에 글로벌 함수 foo
이 포함되어 있다고 가정합니다. 이 함수의 버전 1과 2가 호환되지 않으며 foo
이 인 경우 AA.so
과 BB.so
에서을 모두 내 보낸 것으로 가정합니다. 이 경우 먼저로드 된 라이브러리가 우선적으로 적용됩니다. AA.so
이 먼저로드되면 BB.so
에서 foo
으로의 호출이 AA.so
의 정의로 해석되고 프로그램이 상태를 손상 시키거나 충돌합니다.
그렇지 않은지 확인하려면 AA.so
및 BB.so
에 nm -D
을 실행하고이 라이브러리에서 내 보낸 심볼의 교차가 비어 있는지 확인해야합니다. 비어 있지 않으면 두 정의가 호환되는지 확인해야합니다.
@Employed Russian!그러나 나는 공유 된 사물이 다른 것에 의존하지 않는다고 믿는다. 그런 의미에서 그들은 공유 된 사물이다. 이상적으로, AA.so 버전은 CC.a 버전 1과 BB를 사용해야합니다. 따라서 CC.a 버전 2를 사용해야합니까? – MayurK
@ KM2 답변 됨. –