2013-08-15 2 views
59

내가 무엇을OS X의 약한 기호 별명이 Linux의 기호 별명과 비슷하거나 이와 유사한가?

리눅스 공유 라이브러리를 작성할 때, 내가 재배치, 기호 표시, 관심을 지불하는 경향이

GOT/PLT 등

적용, 내가 PLT 스텁 때 호출 피하기 위해 노력하고

동일한 라이브러리의 함수는 서로를 호출합니다. 예를 들어, 공유 객체가 두 개의 공용 함수, 즉 foo()bar() (사용자가 호출 할 수 있음)을 제공한다고 가정 해 보겠습니다. 그러나 bar() 함수는 foo()을 호출합니다. 그래서 나는이 경우에 할 것은 이것이다 :

  1. 개인 가시성을 확보 _foo()_bar() 기능을 정의합니다.
  2. _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에
+2

당신의 목표는 심볼에 전화를 걸 때 PLT 스텁을 통해 호출의 오버 헤드를 피하는 것입니다 같은 도서관 에서요? 링커가 이미이 문제를 처리하고 있지 않다는 것을 확인 했습니까? – bdash

+0

@bdash : 그렇습니다. 다른 목표는 컴파일러가 더 많은 최적화를 수행하도록하는 것입니다. LTO를 포함하여 개인 기호가 더 최적화됩니다. 그리고 링커는 LD_PRELOAD가 사용되지 않는다고 보장 할 수 없으므로이 최적화를 수행하지 않습니다. 다른 말로하면 - 일단 동적 연결을하면, 모든 방법을 사용합니다. –

+8

필자가 아는 것은 OS X의 공유 라이브러리에 대한 기본 동작입니다.이 문서를 명확히 밝히는 데 필요한 유일한 문서는'-interposable_list '논쟁. 그것은 심볼이 삽입 가능한 것으로 표시되지 않는 한 모듈 내의 심볼에 대한 호출은 직접 호출이라고 말합니다.이 경우 심볼은 dyld 스텁을 통해 만들어집니다. – bdash

답변

1

, 통화가 자동으로 직접 호출하며 dyld 스텁을 통과하지 않습니다.사실에 대한 증거는 호출을 처리 할 수있는 대체 함수를 삽입 할 수 있도록하려면 인터 포저 블을 사용하여 심볼에 간접적으로 액세스하고 dyld 스텁을 통해 호출을 강제 실행해야합니다. 그렇지 않으면 기본적으로 로컬 호출이 직접 호출되며 dyld를 통해 실행하는 오버 헤드가 발생하지 않습니다.

따라서 Linux에서의 최적화는 이미 기본 동작이며 별칭은 필요하지 않습니다.

그래도 플랫폼 호환 코드를 단순하게 만들려면 별칭을 만들 수 있습니다. 속성 이름으로 "weak_import"또는 "weak"(병합하려는 경우) 만 사용해야합니다.

통근 대해서 typeof (_NAME) 이름 __attribute (weak_import, 별칭 ("_ NAME"));

약한 링크하기에

애플 참조 : 바인딩 마하-O 런타임에 Marking Symbols for Weak Linking
애플 참조 : Scope and Treatment of Symbol Definitions