이것NASM 문서에서" elf
글로벌 방향의 확장 "설명하다,
기호의 ELF 가시성을 제어하도록 선택할 수도 있습니다. 가시성 키워드 중 하나를 추가하기만 하면 됩니다 :
default
, 또는 . 물론 기본값입니다 .internal
hidden
protected
default
이것들은 어디에 정의되어 있나요? 그리고 어떻게 ld
사용하나요? 이해합니다C++에서 자주 언급되는 액세스 수준은 다음과 같습니다.보호받다,사람들, 그리고 사적인, 그런데 ELF가 이것을 언급하는지 모르겠습니다.
내 사용 사례는 C 및 어셈블리이므로 이를 언어와 링커 모두에 관련시킬 수 있다면 보너스 포인트입니다.
답변1
그것은 것 같다NASM 소스이것은 문서와 일치하는 것 같습니다신탁링커 및 라이브러리 가이드, 이는 STV_DEFAULT
, STV_INTERNAL
, STV_HIDDEN
및 에 해당하는 것 같습니다 STV_PROTECTED
.
오라클은 이렇게 말합니다.
STV_DEFAULT
이 속성이 있는 기호의 가시성은STV_DEFAULT
기호의 바인딩 유형에 따라 지정됩니다. 즉, 전역 기호와 약한 기호는 정의 구성 요소, 실행 파일 또는 공유 객체 외부에서 볼 수 있습니다. 지역 기호는 숨겨져 있습니다. 전역 기호와 약한 기호도 선점될 수 있습니다. 즉, 다른 구성 요소에 동일한 이름의 정의를 통해 삽입될 수 있습니다.
STV_PROTECTED
현재 구성 요소에 정의된 기호는 다른 구성 요소에 표시되지만 선점할 수 없는 경우 보호됩니다. 정의 구성 요소 내의 이러한 기호에 대한 모든 참조는 기본 규칙에 의해 삽입된 정의가 다른 구성 요소에 존재하는 경우에도 해당 구성 요소의 정의로 해석되어야 합니다. 바인딩이 있는 기호는 표시STB_LOCAL
되지 않습니다STV_PROTECTED
.
STV_HIDDEN
현재 컴포넌트에 정의된 심볼의 이름이 다른 컴포넌트에 보이지 않으면 해당 심볼은 숨겨집니다. 이러한 기호는 보호되어야 합니다. 이 속성은 구성 요소의 외부 인터페이스를 제어하는 데 사용됩니다. 이러한 기호로 명명된 개체는 해당 주소가 외부로 전달되는 경우 다른 구성 요소에서 계속 참조될 수 있습니다.
STB_LOCAL
재배치 가능한 객체가 실행 가능 객체 또는 공유 객체에 포함되어 있는 경우 링크 편집기는 재배치 가능한 객체에 포함된 숨겨진 기호를 제거하거나 바인딩으로 변환합니다.
STV_INTERNAL
이 가시성 속성은 현재 예약되어 있습니다.
C와 Assembly에 미치는 영향은 다음과 같습니다.오라클 문서는 계속해서 말합니다.
링크 편집 중에 가시성 속성은 실행 파일이나 공유 라이브러리의 기호 해상도에 영향을 미치지 않습니다. 이 해결 방법은 바인딩 유형에 따라 제어됩니다. 링크 편집기가 해상도를 선택하면 이러한 속성에는 두 가지 요구 사항이 적용됩니다. 두 요구 사항 모두 연결된 코드의 참조가 속성을 활용하도록 최적화되었을 수 있다는 사실을 기반으로 합니다.
첫째, 기호 참조에 적용될 때 기본이 아닌 모든 가시성 속성은 참조를 충족하는 정의가 현재 실행 가능 개체 또는 공유 개체에 제공되어야 함을 의미합니다. 이 유형의 기호 참조가 연결된 구성 요소 내에 정의되지 않은 경우 참조에는
STB_WEAK
바인딩이 있어야 하며 0으로 확인되어야 합니다.둘째, 이름에 대한 참조 또는 정의가 기본값이 아닌 가시성 속성을 가진 기호인 경우 가시성 속성은 연결된 개체의 확인된 기호에 전파되어야 합니다. 기호의 다양한 참조 또는 정의에 대해 다양한 가시성 속성이 지정된 경우 가장 바인딩된 가시성 속성이 연결된 개체의 확인된 기호에 전파되어야 합니다. 속성은 ,
STV_PROTECTED
및STV_HIDDEN
와 같이 가장 작은 제약 조건부터 가장 큰 제약 조건까지 순서대로 정렬됩니다STV_INTERNAL
.
당신은 또한 볼 수 있습니다