2017-12-04 3 views
0
내가 옵션에 대한 이해를 제공함으로써 시작합니다

는 :extern-only 및 defined-only 옵션에 대한 nm 도구 출력이 왜 중복됩니까?

  1. 은 통근은 전용 : 나에게 그 정의 (코드 또는 변수) 다른 바이너리에 의해 제공됩니다 만 바이너리 참조하는 심볼 만보기
  2. 정의 전용 : 정의가 바이너리에 포함 된 기호 만 표시합니다. 당신이 볼 수 있듯이

    $nm -defined-only GenerationOfNow | grep FIRAZeroingWeakContainer 
    000000010002c128 t -[FIRAZeroingWeakContainer .cxx_destruct] 
    000000010002c0fb t -[FIRAZeroingWeakContainer object] 
    000000010002c114 t -[FIRAZeroingWeakContainer setObject:] 
    000000010021a218 S _OBJC_CLASS_$_FIRAZeroingWeakContainer 
    00000001002177f8 s _OBJC_IVAR_$_FIRAZeroingWeakContainer._object 
    000000010021a1f0 S _OBJC_METACLASS_$_FIRAZeroingWeakContainer 
    
    $nm -extern-only GenerationOfNow | grep FIRAZeroingWeakContainer 
    000000010021a218 S _OBJC_CLASS_$_FIRAZeroingWeakContainer 
    000000010021a1f0 S _OBJC_METACLASS_$_FIRAZeroingWeakContainer 
    

    에서, -extern 전용 출력이 -defined 전용 출력의 하위 집합입니다 : 여기

내 명령과 출력됩니다. 왜? 아마도 제 질문은 다음과 같아야합니다. 두 번째 열에 S가있는 항목의 의미는 무엇입니까?

답변

2

-extern-only-undefined-only을 혼동하고 있습니다.

여기에 혼합되는 두 개념이 있습니다

  • 통근 대
  • 이 정의 대 정의 된 로컬 (C externstatic에서 "지역은"때로는 "개인"이라고합니다) 후자의 원점 설명하면서

전자는 심볼의 가용성 설명한다. 그리고 네, 개인 정의되지 않은 심볼의도 개념이 man nm에 따라, 존재 :

각 심볼 이름은 그 값 앞에는 (공백은 정의되지 않은 경우). [...] 동적 공유 라이브러리의 소문자 u는 동일한 라이브러리의 다른 모듈에있는 개인 외부에 대한 정의되지 않은 참조를 나타냅니다. -undefined-only를 사용하는 경우

지금, 당신은 실제로 그러나 보완 플래그를하지 않는 것

bash$ nm -undefined-only test.dylib 
_printf 
dyld_stub_binder 
bash$ nm -extern-only test.dylib 
0000000000000f60 T _derp 
       U _printf 
       U dyld_stub_binder 

-extern-only

bash$ nm -defined-only test.dylib 
0000000000000f60 T _derp 
0000000000000f70 t _herp 
-undefined-only

bash$ nm test.dylib 
0000000000000f60 T _derp 
0000000000000f70 t _herp 
       U _printf 
       U dyld_stub_binder 
의 보수를받을 수 있나요.