문제

일부 플랫폼은 공유 라이브러리의 외부 기호 목록을 링커에 제공해야합니다. 그러나 필요하지 않은 대부분의 단축 시스템에서 : 모든 비 정적 기호는 기본적으로 사용할 수 있습니다.

내 이해는 GNU 도구 체인이 명시 적으로 선언 된 기호로 가시성을 선택적으로 제한 할 수 있다는 것입니다. GNU LD를 사용하여 어떻게 달성 할 수 있습니까?

도움이 되었습니까?

해결책

암소 비슷한 일종의 영양 ld ELF 플랫폼에서 그렇게 할 수 있습니다.

링커 버전 스크립트로 수행하는 방법은 다음과 같습니다.

/* foo.c */
int foo() { return 42; }
int bar() { return foo() + 1; }
int baz() { return bar() - 1; }

gcc -fPIC -shared -o libfoo.so foo.c && nm -D libfoo.so | grep ' T '

기본적으로 모든 기호가 내보립니다.

0000000000000718 T _fini
00000000000005b8 T _init
00000000000006b7 T bar
00000000000006c9 T baz
00000000000006ac T foo

내보내기 만하고 싶다고 가정 해 봅시다 bar() 그리고 baz(). "버전 스크립트"만들기 libfoo.version:

FOO {
  global: bar; baz; # explicitly list symbols to be exported
  local: *;         # hide everything else
};

링커로 전달하십시오.

gcc -fPIC -shared -o libfoo.so foo.c -Wl,--version-script=libfoo.version

내보낸 기호 관찰 :

nm -D libfoo.so | grep ' T '
00000000000005f7 T bar
0000000000000609 T baz

다른 팁

가장 쉬운 방법은 -fvisibility=hidden GCC 옵션을 사용하고 코드에서 공개적으로 일부 기호를 명시 적으로 가시적으로 만듭니다. __attribute__((visibility("default")))). 문서를 참조하십시오 여기.

LD 링커 스크립트로이를 달성 할 수있는 방법이있을 수 있지만, 나는 그것에 대해 많이 모릅니다.

수출 된 함수를 호출하거나 내보내는 글로벌을 사용하도록 생성 된 코드는 수출되지 않은 코드보다 덜 효율적입니다. 추가 간접 수준이 관련되어 있습니다. 이것은 모든 기능에 적용됩니다 아마도 수출 엮다 시각. GCC는 여전히 링커 스크립트로 나중에 예비화되지 않은 함수에 대한 추가 간접을 생성합니다. 따라서 가시성 속성을 사용하면 링커 스크립트보다 더 나은 코드가 생성됩니다.

libtool을 사용하는 경우 러시아의 대답을 사용하는 것과 매우 유사한 또 다른 옵션이 있습니다.

그의 예제를 사용하면 다음과 같습니다.

cat export.sym
bar
baz

그런 다음 다음 옵션으로 libtool을 실행하십시오.

libtool -export-symbols export.sym ...

-export -symbols를 사용하는 경우 모든 기호는 기본적으로 내보내지 않으며 Export.sym의 기호 만 내보내는 것입니다 (따라서 Libfoo의 "local : *"라인은 실제로이 접근법에서 암시 적입니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top