2017-12-19 7 views
0

foo.o으로 구성된 libfoo.a을 배송하고 싶습니다. 이는 libVendorBar.alibVendorZoo.a에 달려 있습니다.종속 라이브러리의 심볼 만 제거하는 방법은 무엇입니까?

libfoo.a을 링크하여 생성 할 때 libVendor*.a의 심볼은 잠재적 인 클라이언트 응용 프로그램이 링크 할 수 있도록 공개되어 표시됩니다.

내 통제 범위를 벗어난 많은 이유로 제 3 자 클라이언트가 공급 업체 라이브러리와 직접 연결할 수 없도록하고 싶습니다.

gcc가 libfoo의 모든 libVendor 기호를 해결하고이를 버리면 libfoo의 기호 만 표시됩니다.

현재 LD_FLAGS을 사용하고 있지 않으며 모든 것이 정적으로 연결되어 있습니다.

+0

이 https://linux.die.net/man/1/strip을 보셨습니까? – zappy

+0

'strip'은'-K'로도 원하는 것을하지 않습니다. 그것은 정적 라이브러리에서 아카이브 인덱스라는 것을 버리는 것 같습니다. [ranlib를 통해 색인을 다시 생성하면] (https://stackoverflow.com/questions/11346240/ranlib-and-static-library) 링크 된 바이너리는 모든 "분기 및 링크"명령어가있는 * super * strange입니다 무한 루프를 만드는 것입니다. 나는 근본적으로 잘못된 것을하고 있다는 것을 깨닫기 전에 반나절에'strip'과'ranlib'의 낙진을 디버깅하는 것을 보냈습니다. 분명히 내가 원하는 것을 할 수있는'gcc '안에 뭔가가 있어야만 하는가? –

+0

https://stackoverflow.com/questions/33851045/gcc-a-static-library-with-undefined-symbols에 따르면 내가 찾고있는 것은 모든 기호를 완전히 해결하는 '-static' 플래그입니다. 나는 이것이 gcc가 대부분의 심볼을 버릴만큼 영리하다는 것을 의미하기를 바라고 있습니다. 나는 그것이 작동하면 내일이 게시물을 업데이 트 것 같아요. –

답변

1

정적 라이브러리는 공유 라이브러리에 사용 된 -fvisibility=hidden과 동일하지 않습니다. 이것은 당신이 공급 업체 기호가 여전히 존재 (공급 업체 libs와없이 libfoo.a을 출시 할 수 있도록 할

ld -r foo.o -Lpath/to/vendor/libs -lBar -lZoo -o foo_linked.o 

:

  • 첫 번째 링크에 필요한 모든 코드 foo.o에 : 당신은 당신이 비록 더 많은 작업에 필요한 달성 할 수 그것 안에). 링커는 최종 실행 파일 링크시 재배치 처리를해야하므로

  • 은 불행하게도 당신은 단순히 라이브러리 symtab에서 (예를 들어, objcopy -Lstrip --strip-symbol를 통해) 공급 업체 기호를 제거 할 수 없습니다. 하지만 당신은 적어도 읽을 수없는 뭔가로 이름을 바꿀 수 있습니다 :이 리버스 엔지니어링 업체의 코드에서 동기 사용자를 멈추지 않을 것

    for sym in all symbols you want to hide; do 
        id=$(echo $sym | md5sum | awk '{print $1}') 
        objcopy --redefine-sym $sym=f_$id foo_linked.o 
    done 
    

    참고 그러나 것이다.

+0

이것은 받아 들일 수있는 대안입니다 - 감사합니다! –