2014-05-15 1 views
4

보관 파일에 C 라이브러리가 있습니다 (clib.a). 나는 그것을 위해 cpp.o을은 C++ 래퍼를 작성했습니다, 그리고 정적 라이브러리로 사용하고 싶습니다 :링크 된 개체의 전역 심볼 범위 제한

ar cTrvs cppwrap.a clib.a cpp.o 

코드를 직접 정확하지 않는 clib.a에서 물건을 사용할 수 없습니다이로 연결 헤더가 포함됩니다. 그러나 누군가가 우연히 적절한 프로토 타입을 만듭니다 (예 : void myCoincidentallyNamedGlobalFunction() - myCoincidentallyNamedGlobalFunction의 정의가 적용될 것입니다. clib.a에서 기호 이후

cpp.o에 액세스하고, cppwrap.a에 연결되지 아무것도 할 필요가, (그래서 심지어는 실패 할 것 CLIB 헤더를 포함)에는 가능한 충돌이 없도록 완벽하게 숨길 수있는 방법은 무엇입니까?

+0

'clib.o'는 스스로 만들고있는 것입니까, 아니면 랩핑하고 싶은 다른 사람이 건네주는 모 놀리 식 바이너리입니까? – Jeff

+0

@ 제프 나는 그것을 짓고있다. 그렇다. – delicateLatticeworkFever

+1

그래서 몇 가지 옵션이 있다고 생각합니다. 익명의 네임 스페이스에서 내보내기를 원하지 않는 메소드/변수를 숨길 수 있습니다.이 방법은 아마도 가장 깨끗한 방법 일 수 있습니다. 또는 최종 분산에서 노출시키지 않으려는 심볼을 수동으로'strip -N' 또는'objcopy -N' 심볼로 만들 수 있습니다 도서관. – Jeff

답변

2

수동으로 최종 결합 된 라이브러리에 불필요한 문자를 제거 할 수 있습니다

$ objcopy -N foo cppwrap.a (제거 기호)

또는, 당신은 기호를 필요로하지만, 외부 사용자가 그들에게 얻을 수 있는지 확인하려면 :

$ objcopy -L bar cppwrap.a (지역화 기호) clib.a의 상징에 뭔가가 볼 수 있어야합니다 경우

또는, cpp.o하지만 당신은 그것을 다른 사람이 사용하고 싶지 않은 : 비록

$ objcopy -W baz cppwrap.a (약화 기호)이 경우

, 다른 오브젝트 파일/라이브러리에서 기호 충돌이 자신의 사용에 연기합니다 기호는 계속 표시됩니다. 더 일을 모호하게하거나 심지어 공경 충돌의 가능성을 줄이기 위해, 당신은 또한 사용할 수 있습니다

$ objcopy --redefine-sym old=new cppwrap.a

이 기능이 있다는 래퍼 필요하지만 경우가 아니라, 어떤 경우에 도움을 수있는 익명의 공간 외부 사용자로부터 숨기기를 시도합니다.

+0

'namespace' 솔루션은 물론'cpp.o '의 함수가'clib.o'의 함수를 호출하는 것을 불가능하게 만듭니다. –

+0

'objcopy'는 재배치 "*에서 명명 되었기 때문에 기호"baz '를 제거하지 않습니다 *를 리턴합니다.귀하의 예제를 오해하지 않는 한 네임 스페이스를 사용하는 것은 좋지 않습니다. A)'clib.o'에 컴파일 된 코드는 C 코드입니다. B) 나는 clib를 전혀 수정하지 않고 싶습니다. 완전히 블랙 박스에 넣고 싶습니다. 아카이브 내부. – delicateLatticeworkFever

+0

맞습니다. 처음에는 불필요한 기호를 단순히 가릴 필요가 있는지, 핵심 기능에 cpp.o 기호 이름을 통해서만 액세스 할 수 있는지 확인하려고했습니다. – Jeff