GCC 확장attribute__ ((visibility("hidden")))

이러한 상황을 생각해 보면 프로그램은 어떤 함수 A를 호출하고 A 함수는 두 개의 동적 링크 라이브러리liba.에 존재한다.so,libb.so에서, 그리고 프로그램 실행은 이 두 라이브러리를 연결해야 한다. 이때 프로그램이 호출하는 A 함수는 도대체 a에서 온 것입니까, 아니면 b에서 온 것입니까?
이것은 링크할 때의 순서에 달려 있다. 예를 들어 먼저 링크liba.so, 이때liba를 통해so의 내보내기 기호표는 함수 A의 정의를 찾을 수 있으며 기호표에 추가하여libb를 연결할 수 있습니다.so일 때 기호표에 함수 A가 존재하면 기호표를 다시 업데이트하지 않기 때문에 항상 liba.so의 A 함수
 
이곳의 호출은 링크 라이브러리의 불러오는 순서에 심각하게 의존하여 혼란을 초래할 수 있습니다.gcc의 확장에는 다음과 같은 속성이 있습니다attribute__ ((visibility("hidden")) 함수의 이름을 내보내는 것을 억제하는 데 사용할 수 있습니다. 이 라이브러리에 연결된 프로그램 파일에는 함수가 보이지 않습니다. 다음과 같은 방법을 사용합니다.
-visibility=default|internal|hidden|protected gcc의visibility는 이 속성을 컴파일할 때 사용하면 동적 라이브러리의 기호는 강제로 설명하지 않는 한hidden이다.1. c소스 파일을 만듭니다. 내용이 간단합니다.

   
   
   
   
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3.  
  4.  
  5. __attribute ((visibility("default"))) void not_hidden ()  
  6. {  
  7. printf("exported symbol
    "
    );  
  8. }  
  9.  
  10. void is_hidden ()  
  11. {  
  12. printf("hidden one
    "
    );  
  13. }  


 
첫 번째 함수 기호는 내보낼 수 있고 두 번째는 숨길 수 있습니다.먼저 동적 라이브러리로 컴파일하여 속성 -fvisibility에 사용

   
   
   
   
  1. gcc -shared -o libvis.so -fvisibility=hidden vis.c 

지금 보기

   
   
   
   
  1. # readelf -s libvis.so |grep hidden  
  2. 7: 0000040c 20 FUNC GLOBAL DEFAULT 11 not_hidden  
  3. 48: 00000420 20 FUNC LOCAL HIDDEN 11 is_hidden  
  4. 51: 0000040c 20 FUNC GLOBAL DEFAULT 11 not_hidden  

보시다시피 속성이 확실히 작용했습니다.현재 링크

   
   
   
   
  1. vi main.c  
  2. int main()  
  3. {  
  4. not_hidden();  
  5. is_hidden();  
  6. return 0;  

실행 가능한 파일로 컴파일하여 방금 생성된 동적 라이브러리에 연결하려고 합니다.

   
   
   
   
  1. gcc -o exe main.c -L ./ -lvis 

결과 프롬프트:

   
   
   
   
  1. /tmp/cckYTHcl.o: In function `main':  
  2. main.c:(.text+0x17): undefined reference to `is_hidden'  

히든이 확실히 작용했음을 설명한다.

좋은 웹페이지 즐겨찾기