내가 무엇을OS X의 약한 기호 별명이 Linux의 기호 별명과 비슷하거나 이와 유사한가?
리눅스 공유 라이브러리를 작성할 때, 내가 재배치, 기호 표시, 관심을 지불하는 경향이GOT/PLT 등
적용, 내가 PLT 스텁 때 호출 피하기 위해 노력하고동일한 라이브러리의 함수는 서로를 호출합니다. 예를 들어, 공유 객체가 두 개의 공용 함수, 즉 foo()
과 bar()
(사용자가 호출 할 수 있음)을 제공한다고 가정 해 보겠습니다. 그러나 bar()
함수는 foo()
을 호출합니다. 그래서 나는이 경우에 할 것은 이것이다 :
- 개인 가시성을 확보
_foo()
및_bar()
기능을 정의합니다. _foo()
및_bar()
에 대해 각각foo()
및bar()
약한 별칭을 정의하십시오.
그런 식으로, 공유 객체의 코드는 결코 약한 심볼을 사용하지 않습니다. 로컬 함수 만 직접 호출합니다. 예를 들어, _bar()
이 호출되면 _foo()
을 직접 호출합니다.
그러나 사용자는 _*
기능을 인식하지 못합니다 항상 약한 별칭을 해당 사용합니다.
나는
리눅스, 이것은 다음과 같은 구조를 사용하여 달성 그것을 할 방법 :
extern __typeof (_NAME) NAME __attribute__(weak, alias("_NAME"));
문제 불행하게도
,이 OS X 작동하지 않습니다 . 나는 OS X 또는 그 바이너리 포맷에 대한 깊은 지식이 없기 때문에 조금 찌르다가 약한 기능들 (예 : this one)의 몇 가지 예를 발견했다. 그러나 그것들은 q uite는 약한 심볼을 가질 수있는 것과 동일하지만 DSO의 로컬 함수에 대한 별칭 인 약한 심볼은 아닙니다. 지금은
가능한 해결 ...
은, 그냥 모든 기호가 전역 및 기본 가시성을 가질 수 있도록 (즉, 매크로를 사용하여 구현)이 기능을 사용할 수있다. 내가 지금 생각해 볼 수있는 유일한 방법은 모두 _foo
에 개인적인 시야가있는 기능을두고 해당하는 foo
기능에 기본 표시 여부와 "숨겨진"기능을 호출하는 것입니다.
더 좋은 방법? 그러나, 코드의 좋은 덩어리를 필요로
을 변경할 수 있습니다. 그러므로 나는 정말로 다른 방법이 없다면 거기에 가지 않는 것을 선호 할 것입니다.
그래서 닫히고의 OS X의 대체 또는 동일한 의미/동작을 얻을 수있는 가장 쉬운 방법은 무엇입니까? 도서관 내에서
OS X에
당신의 목표는 심볼에 전화를 걸 때 PLT 스텁을 통해 호출의 오버 헤드를 피하는 것입니다 같은 도서관 에서요? 링커가 이미이 문제를 처리하고 있지 않다는 것을 확인 했습니까? – bdash
@bdash : 그렇습니다. 다른 목표는 컴파일러가 더 많은 최적화를 수행하도록하는 것입니다. LTO를 포함하여 개인 기호가 더 최적화됩니다. 그리고 링커는 LD_PRELOAD가 사용되지 않는다고 보장 할 수 없으므로이 최적화를 수행하지 않습니다. 다른 말로하면 - 일단 동적 연결을하면, 모든 방법을 사용합니다. –
필자가 아는 것은 OS X의 공유 라이브러리에 대한 기본 동작입니다.이 문서를 명확히 밝히는 데 필요한 유일한 문서는'-interposable_list '논쟁. 그것은 심볼이 삽입 가능한 것으로 표시되지 않는 한 모듈 내의 심볼에 대한 호출은 직접 호출이라고 말합니다.이 경우 심볼은 dyld 스텁을 통해 만들어집니다. – bdash