development

Linux에서와 유사한 OS X의 약한 기호 별칭 또는 가장 유사한 별칭?

big-blog 2020. 12. 9. 21:11
반응형

Linux에서와 유사한 OS X의 약한 기호 별칭 또는 가장 유사한 별칭?


내가하는 일

Linux 용 공유 라이브러리를 작성할 때 재배치, 기호 가시성, GOT / PLT 등에주의를 기울이는 경향이 있습니다.

해당되는 경우 동일한 라이브러리의 함수가 서로 호출 할 때 PLT 스텁을 호출하지 않으려 고합니다. 예를 들어, 공유 객체가 두 개의 공용 기능을 제공한다고 가정 해 보겠습니다.- foo()bar()(둘 중 하나는 사용자가 호출 할 수 있음). bar()기능은, 그러나, 또한 호출합니다 foo(). 이 경우 제가하는 일은 다음과 같습니다.

  1. 정의 _foo()_bar()개인 가시성을 확보 기능.
  2. 정의 foo()bar()약한 별칭 _foo()_bar()각각.

이렇게하면 공유 객체의 코드가 약한 기호를 사용하지 않습니다. 로컬 함수 만 직접 호출합니다. 예를 _bar()들어가 호출되면 _foo()직접 호출 합니다.

그러나 사용자는 _*기능을 인식하지 못하고 항상 해당하는 약한 별칭을 사용합니다.

어떻게하나요

Linux에서는 다음 구성을 사용하여이를 수행합니다.

extern __typeof (_NAME) NAME __attribute__(weak, alias("_NAME"));

문제

불행하게도, 내가 조금 주위를 찌르고 (같은 약한 기능의 몇 가지 예를 찾을 수 있도록 OS X에서 나는이 작동하지 않음은, OS X 또는 바이너리 형식의 더 깊은 지식이없는 이 일을 ), 그러나 그 꽤하지 않는다 약한 기호를 가질 수 있지만 DSO의 로컬 기능에 대한 별칭 인 약한 기호는 사용할 수 없습니다.

가능한 해결책...

지금은 모든 심볼이 전역이고 기본 가시성을 갖도록이 기능 (매크로를 사용하여 구현 됨)을 비활성화했습니다. 지금 당장 동일한 것을 달성하기 위해 생각할 수있는 유일한 방법은 모든 _foo기능을 비공개 가시성을 갖고 foo기본 가시성을 갖는 대응 기능을 갖고 "숨겨진" 대응 기능을 호출하는 것입니다.

더 나은 방법?

그러나 변경하려면 좋은 코드 덩어리가 필요합니다. 그러므로 나는 정말로 다른 방법이 없다면 거기에 가지 않는 것을 선호합니다.

그렇다면 closes OS X 대안 또는 동일한 의미 / 동작을 얻는 가장 쉬운 방법은 무엇입니까?


OS X에서 라이브러리 내에서 이루어진 호출은 자동으로 직접 호출되며 dyld 스텁을 거치지 않습니다. 사실에 대한 증거는 호출 서비스를 위해 대체 함수를 삽입 할 수 있으려면 인터 포저 블을 사용하여 심볼에 대한 간접 액세스를 강제하고 dyld 스텁을 통해 호출을 강제 실행해야합니다. 그렇지 않으면 기본적으로 로컬 호출이 직접적이고 dyld를 통해 실행되는 오버 헤드가 발생하지 않습니다.

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

그래도 플랫폼 호환 코드를 더 간단하게 만들기 위해이 작업을 수행하려는 경우에도 별칭을 만들 수 있습니다. 속성 이름으로 "weak_import"또는 "weak"(통합하려는 경우)을 사용하면됩니다.

extern typeof (_NAME) NAME __attribute (weak_import, alias ( "_ NAME"));

약한 연결에 대한 Apple 참조 : 약한 연결에 대한 기호 표시
Mach-O 런타임 바인딩에 대한 Apple 참조 : 기호 정의의 범위 및 처리

참고 URL : https://stackoverflow.com/questions/18260207/weak-symbol-aliases-on-os-x-similar-to-those-on-linux-or-a-closest-equivalent

반응형