GCC 확장attribute__ ((visibility("hidden")))
4208 단어 gcc직장확장성레저__attribute__
이것은 링크할 때의 순서에 달려 있다. 예를 들어 먼저 링크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소스 파일을 만듭니다. 내용이 간단합니다.
- #include<stdio.h>
- #include<stdlib.h>
-
-
- __attribute ((visibility("default"))) void not_hidden ()
- {
- printf("exported symbol
");
- }
-
- void is_hidden ()
- {
- printf("hidden one
");
- }
첫 번째 함수 기호는 내보낼 수 있고 두 번째는 숨길 수 있습니다.먼저 동적 라이브러리로 컴파일하여 속성 -fvisibility에 사용
- gcc -shared -o libvis.so -fvisibility=hidden vis.c
지금 보기
- # readelf -s libvis.so |grep hidden
- 7: 0000040c 20 FUNC GLOBAL DEFAULT 11 not_hidden
- 48: 00000420 20 FUNC LOCAL HIDDEN 11 is_hidden
- 51: 0000040c 20 FUNC GLOBAL DEFAULT 11 not_hidden
보시다시피 속성이 확실히 작용했습니다.현재 링크
- vi main.c
- int main()
- {
- not_hidden();
- is_hidden();
- return 0;
- }
실행 가능한 파일로 컴파일하여 방금 생성된 동적 라이브러리에 연결하려고 합니다.
- gcc -o exe main.c -L ./ -lvis
결과 프롬프트:
- /tmp/cckYTHcl.o: In function `main':
- main.c:(.text+0x17): undefined reference to `is_hidden'
히든이 확실히 작용했음을 설명한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
execl 컴파일 시 경고:warning: not enough variable arguments to fit a sentinel 설명 (전재)warning: missing sentinel in function call warning: not enough variable arguments to fit a sentinel Sentinels & warnings...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.