2017-01-20 1 views
0

libMissingSymbol.so, libMiddle.so 및 libSymbolHaver.so의 세 라이브러리가 있다고 가정 해보십시오. libMissingSymbol은 libSymbolHaver에 정의 된 심볼을 포함하지만 libMiddle에만 종속됩니다. libMiddle은 libSymbolHaver에 의존성이 있다고 가정되지만 그렇지 않습니다. 나는이 라이브러리가 어셈블 된 소스 코드 또는 링크 해제 된 오브젝트 파일을 가지고 있지 않습니다. libMissingSymbol이로드 타임에 필요한 심볼을 찾을 수 있도록 libMiddle을 libSymbolHaver와 연결할 수 있습니까? 이 세 가지 공유 객체 파일과 필요한 도구 만 사용하여이 문제를 해결할 수있는 방법이 있습니까? 나는 내 프로젝트에서 줄을 더 이상 부수 지 않기 위해 libMiddle에 대한 종속성 변경을 금지하는 동일한 내용 (SONAME 포함)이있는 라이브러리로 끝내야한다. (관련성 손질)기존 공유 객체 라이브러리에 종속성 추가

가설 readelf 출력은 명확히 : libMissingSymbol 그것이로드시 필요한 기호를 찾을 수 있도록 나를 libSymbolHaver와 libMiddle을 연결하는

$ readelf -s libMissingSymbol.so 
123: 00000000  0 OBJECT GLOBAL DEFAULT UND MangledSymbol 

$ readelf -d libMissingSymbol.so 
Dynamic section at offset 0x42434 contains 37 entries: 
    Tag  Type       Name/Value 
0x00000001 (NEEDED)      Shared library: [libMiddle.so] 
0x0000000e (SONAME)      Library soname: [libMissingSymbol.so] 

$ readelf -d libMiddle.so 
Dynamic section at offset 0x75b28 contains 29 entries: 
    Tag  Type       Name/Value 
0x0000000e (SONAME)      Library soname: [libMiddle.so] 

$ readelf -s libSymbolHaver.so 
    35: 00064d0c  4 OBJECT GLOBAL DEFAULT 22 MangledSymbol 

답변

1

이 가능합니까?

없음 다음 AIX 하나를 제외한 모든 UNIX 링커는 .so최종 링크 제품을 고려하지 않고 더 이상의 수정은 불가능합니다.

업데이트 :이 다른 방식으로하고 (예를 들어, 디 컴파일의 libMiddle을하고 올바른 의존성을 재건)의

생존?

그 중 하나 실용적이라고 생각하지 않습니다 - 그것은 내부 일관성 제약의 수많은을 위반 완벽하게 연동 ELF 파일을 수정하지 정말 열심히 입니다.

저는 다음과 같은 방법을 제안합니다.이 방법은 작업하기 쉽습니다 (TM).

  1. "이러한 세 가지 라이브러리 만 사용"제한을 포기하십시오. 인위적이며 불필요한 것으로 보입니다.

  2. 복사 libMiddle.so ->libZiddle.so (문제가 생길 경우를 대비하여 원래 libMiddle.so 사본을 만들어 두십시오).

  3. 이진 패치 SONAMElibZiddle.so으로 변경하여 새 이름과 일치시킵니다. 문자열 "libMiddle.so"은 라이브러리의 .dynstr 섹션에 있으며 어떤 식 으로든 해시되지 않으므로이 라이브러리에서 한 문자를 변경하더라도 새 라이브러리에 자체 불일치가 발생하지 않습니다. 이 작업을 완료하면

    , readelf -a libMiddle.soreadelf -a libZiddle.so에서, SONAME 차이해야한다 비교합니다.

  4. libMiddle.so을 삭제하십시오.

  5. 링크 모두libZiddle.solibSymbolHaver.so에 동적 의존성을 갖는 some_unused_function(), 을 포함하는 새로운 libMiddle.so.

지금 현재 libMiddle.so에 연결하고 누락 된 기호에 실패 바이너리 (예 : libMissingSymbol.so) 찾을 수 있습니다 새로운 (빈) libMiddle.so하지만 새로운 libMiddle.so는 (기호의 대부분은) 모두 libZiddle.so을 필요로하기 때문에 및libSymbolHaver.so, 그냥 작동합니다.

+0

답변 해 주셔서 감사합니다. 다른 방법 (예 : libMiddle 디 컴파일 링 및 올바른 종속성으로 다시 빌드)을 수행 할 수 있는지에 대한 통찰력이 있습니까? –

+0

@ThomasDeSilva 답변을 업데이트했습니다. –

+0

Re : point # 1,이 모든 것의 요점은 내가 제어 할 수없는 다른 실행 환경을 에뮬레이트하기 때문입니다. (자세한 특정 포럼 [여기]] (https : //www.chiefdelphi.com/forums/showthread.php?t=153697)을 참조하십시오. 귀하의 개정에 따라 제 상황이 다시 점검되었습니다. 실제 라이브러리에서 버전 차이가 발생했습니다. 귀하의 접근 방식을 시도 할 필요는 없었지만 귀하의 답변을 수락합니다. 다시 도움을 주셔서 감사합니다. –

관련 문제