강력한 기호, 약한 심볼

축 어적으로 https://www.dazhuanlan.com/2019/08/26/5d6304ae4bca7/


강한 기호 (강한 기호), 약한 심볼 (약한 심볼) 링커, 모든 글로벌 심볼은 두 가지로 나뉠 수있다. 속성이 GCC 보유 특성 () (약한)이 기호는 약한 심볼을 선언하는 데 사용된다. GCC 매뉴얼 작성 :

약한 특성이 오히려 지난 글로벌 내 약한 상징으로 방출 될 수있는 선언을 원인.이 정의에서 주로 유용 라이브러리 함수 IT는 또한 비 함수 선언과 함께 사용할 수 있지만, 사용자 코드에서 재정의 될 수있다. 약한 기호가 지원됩니다 ELF 대상을, 또한 a.out을위한 목표는 GNU 어셈블러와 링커를 사용하는 경우.
이 GCC 확장을 위해, 여기에서 우리는 간단한 소개를했다. 이제 더 일반적인 경우를 살펴 보자. ;)

일반적으로, 함수 및 변수 초기화 강한 기호 초기화 변수 약한 상징한다. 그들에게 다음과 같은 세 가지 규칙이 적용됩니다 :

같은 이름의 1. 강력한 기호는 하나가 될 수 있습니다.
2. 같은 이름의 강하고 약한 문자가 가능하지만, 정의는 강력한 기호를 선택할 수 있습니다.
약한 심볼 복수 링커 어느 하나를 선택할 수있다 (3).

세 가지 규칙을 잘 이해 보인다, 그것은 약한 기호와 상징의 이러한 유형 동시에 강하지 않다, 특히 사실이 아니다! 겉으로 정확한 과정은 심각한 오류가 발생할 수 있습니다! 다음과 같은 고려 의 csapp 예 :

=== AC ===
INT X = 7;
INT의 Y = 5;
P1 () {}

=== BC ===
더블 X;
P2 () {}

우리는 함께 컴파일하고, P2 () 함수 X에 할당, 당신은 발견 할 것이다, Y도 변경! x는 이중으로 간주되어 있지만 INT의 X에 정의 된 교류를 취할 것입니다 만, 즉, 교류의 INT X 기원전 때 사용하는 방법의 두 배로 말을하는 것입니다! 물론 이것은 잘못입니다! 그 이유는 위의 규칙이 있기 때문이다. 이 문제를 방지하는 방법 중 하나는 GCC -fno-일반적인 옵션을 추가하는 것입니다.

약한 심볼에, 남자는 설명서를 설명했다 :

추천

출처www.cnblogs.com/petewell/p/11410486.html