2015-10-08 56 views
4

我正在寫一個小型的動態庫,它使用Objective-C並向Unity展示C-linkage功能(這是一個本地插件)。爲什麼不能隱藏Objective-C目標文件中的符號?

即使我的編譯器設置有符號默認是隱藏的設置爲,和我使用的函數聲明我要揭露,甚至static符號(函數和全局變量)__attribute__((visibility("default")))出現在輸出圖書館。

我已經重新創建一個test Xcode project,最初載有C文件

file.h:

#pragma once 

extern __attribute__((visibility("default"))) void not_hidden(); 

file.c:

#include "file.h" 
#include <stdio.h> 

static void hidden() 
{ 
    printf("I'm hidden\n"); 
} 

void not_hidden() 
{ 
    printf("I'm not hidden\n"); 
    hidden(); 
} 

,這像宣傳的那樣:

$ nm libHiddenSymbolTest.dylib 
0000000000000f40 T _not_hidden 
       U _printf 
       U dyld_stub_binder 

然而只要我添加具有類似功能(not_hidden2(),等等)一個Objective-C文件,那麼所有static符號同樣暴露:

$ nm libHiddenSymbolTest.dylib 
       U _CFStringGetCStringPtr 
       U _NSLog 
00000000000054d0 s _OBJC_METACLASS_$___ARCLite__ 
       U __Block_copy 
       U __DefaultRuneLocale 
0000000000005710 b __ZGVZL18add_image_hook_ARCPK11mach_headerlE7patches 
0000000000005830 b __ZGVZL22add_image_hook_swiftV1PK11mach_headerlE7patches 
0000000000005640 b __ZGVZL30add_image_hook_autoreleasepoolPK11mach_headerlE7patches 
0000000000004160 s __ZL11_class_name 
00000000000039a4 t __ZL12cxxConstructP11objc_object 
00000000000055d0 d __ZL12demangleLock 
000000000000377a t __ZL13demangledNamePKcb 
0000000000002ab3 t __ZL13replaceMethodP10objc_classP13objc_selectorPFP11objc_objectS4_S2_zEPS6_ 
0000000000005748 b __ZL14NSString_class 
00000000000035b0 t __ZL14initialize_impP11objc_objectP13objc_selector 
0000000000001aa2 t __ZL15__ARCLite__loadv 
0000000000003927 t __ZL16scanMangledFieldRPKcS0_S1_Ri 
00000000000041a8 s __ZL17_load_method_name 
00000000000043d0 s __ZL17_load_method_type 
0000000000003461 t __ZL17transcribeMethodsP10objc_classP15glue_class_ro_t 
00000000000022b9 t __ZL18add_image_hook_ARCPK11mach_headerl 
00000000000035b6 t __ZL18allocateMaybeSwiftP18glue_swift_class_tm 
0000000000001f7f t __ZL19patch_lazy_pointersPK11mach_headerP7patch_tm 
00000000000034e5 t __ZL19transcribeProtocolsP10objc_classP15glue_class_ro_t 
00000000000039d4 t __ZL20fixStringForCoreDataP11objc_object 
0000000000003530 t __ZL20transcribePropertiesP10objc_classP15glue_class_ro_t 
0000000000002785 t __ZL21__arclite_objc_retainP11objc_object 
00000000000025e3 t __ZL21__arclite_object_copyP11objc_objectm 
0000000000005740 b __ZL22NSConstantString_class 
00000000000027a1 t __ZL22__arclite_objc_releaseP11objc_object 
000000000000288f t __ZL22add_image_hook_swiftV1PK11mach_headerl 
0000000000003646 t __ZL22copySwiftV1MangledNamePKcb 
0000000000005870 b __ZL22original_class_getName 
0000000000005848 b __ZL22original_objc_getClass 
0000000000005610 b __ZL23NSAutoreleasePool_class 
00000000000033dc t __ZL23__arclite_class_getNameP10objc_class 
0000000000003230 t __ZL23__arclite_objc_getClassPKc 
00000000000054f8 s __ZL24OBJC_CLASS_$___ARCLite__ 
000000000000248c t __ZL24__arclite_object_setIvarP11objc_objectP9objc_ivarS0_ 
0000000000005738 b __ZL25NSMutableDictionary_class 
0000000000005868 b __ZL25original_objc_getProtocol 
0000000000005860 b __ZL25original_objc_lookUpClass 
0000000000005878 b __ZL25original_protocol_getName 
00000000000027b3 t __ZL26__arclite_objc_autoreleaseP11objc_object 
0000000000003384 t __ZL26__arclite_objc_getProtocolPKc 
000000000000332f t __ZL26__arclite_objc_lookUpClassPKc 
0000000000002797 t __ZL26__arclite_objc_retainBlockP11objc_object 
000000000000283f t __ZL26__arclite_objc_storeStrongPP11objc_objectS0_ 
00000000000033f1 t __ZL26__arclite_protocol_getNameP8Protocol 
0000000000005850 b __ZL26original_objc_getMetaClass 
00000000000052c8 s __ZL27OBJC_CLASS_RO_$___ARCLite__ 
0000000000003285 t __ZL27__arclite_objc_getMetaClassPKc 
0000000000005758 b __ZL27original_NSKKMS_indexForKey 
0000000000002b9a t __ZL28__arclite_NSKKMS_indexForKeyP11objc_objectP13objc_selectorS0_ 
0000000000002df0 t __ZL28__arclite_objc_readClassPairP10objc_classPK15objc_image_info 
0000000000005760 b __ZL28original_NSKKsD_objectForKey 
0000000000002bec t __ZL29__arclite_NSKKsD_objectForKeyP11objc_objectP13objc_selectorS0_ 
0000000000005720 b __ZL29original_NSManagedObject_init 
0000000000005718 b __ZL30NSUndoManagerProxy_targetClass 
0000000000002ae6 t __ZL30__arclite_NSManagedObject_initP11objc_objectP13objc_selector 
0000000000001ecb t __ZL30add_image_hook_autoreleasepoolPK11mach_headerl 
000000000000399e t __ZL30arclite_uninitialized_functionv 
0000000000005858 b __ZL30original_objc_getRequiredClass 
0000000000005280 s __ZL31OBJC_METACLASS_RO_$___ARCLite__ 
00000000000032da t __ZL31__arclite_objc_getRequiredClassPKc 
0000000000005838 b __ZL31original_objc_allocateClassPair 
0000000000005840 b __ZL31original_object_getIndexedIvars 
0000000000005310 s __ZL32OBJC_$_CLASS_METHODS___ARCLite__ 
000000000000313d t __ZL32__arclite_objc_allocateClassPairP10objc_classPKcm 
00000000000027c5 t __ZL32__arclite_objc_retainAutoreleaseP11objc_object 
00000000000031de t __ZL32__arclite_object_getIndexedIvarsP11objc_object 
0000000000005770 b __ZL32original_NSKKsD_setObject_forKey 
0000000000002c92 t __ZL33__arclite_NSKKsD_setObject_forKeyP11objc_objectP13objc_selectorS0_S0_ 
0000000000001f6d t __ZL33__arclite_objc_autoreleasePoolPopPv 
0000000000001f54 t __ZL34__arclite_objc_autoreleasePoolPushv 
0000000000005768 b __ZL34original_NSKKsD_removeObjectForKey 
0000000000002c3e t __ZL35__arclite_NSKKsD_removeObjectForKeyP11objc_objectP13objc_selectorS0_ 
0000000000005730 b __ZL35original_NSManagedObject_allocBatch 
0000000000002b0c t __ZL36__arclite_NSManagedObject_allocBatchP11objc_objectP13objc_selectorPS0_S0_j 
0000000000002434 t __ZL36__arclite_object_setInstanceVariableP11objc_objectPKcPv 
0000000000005750 b __ZL36original_NSKKMS_fastIndexForKnownKey 
0000000000005880 b __ZL36original_objc_copyClassNamesForImage 
0000000000002b48 t __ZL37__arclite_NSKKMS_fastIndexForKnownKeyP11objc_objectP13objc_selectorS0_ 
00000000000027f0 t __ZL37__arclite_objc_autoreleaseReturnValueP11objc_object 
0000000000003409 t __ZL37__arclite_objc_copyClassNamesForImagePKcPj 
0000000000005778 b __ZL40original_NSKKsD_addEntriesFromDictionary 
0000000000005728 b __ZL40original_NSManagedObject_allocWithEntity 
0000000000002cfb t __ZL41__arclite_NSKKsD_addEntriesFromDictionaryP11objc_objectP13objc_selectorP12NSDictionary 
0000000000002af9 t __ZL41__arclite_NSManagedObject_allocWithEntityP11objc_objectP13objc_selectorS0_ 
00000000000021e7 t __ZL42__arclite_NSArray_objectAtIndexedSubscriptP7NSArrayP13objc_selectorm 
0000000000002a7a t __ZL42__arclite_NSUndoManagerProxy_isKindOfClassP11objc_objectP13objc_selectorP10objc_class 
0000000000002802 t __ZL43__arclite_objc_retainAutoreleaseReturnValueP11objc_object 
000000000000282d t __ZL44__arclite_objc_retainAutoreleasedReturnValueP11objc_object 
000000000000225b t __ZL46__arclite_NSDictionary_objectForKeyedSubscriptP12NSDictionaryP13objc_selectorP11objc_object 
000000000000226d t __ZL47__arclite_NSOrderedSet_objectAtIndexedSubscriptP12NSOrderedSetP13objc_selectorm 
00000000000021f9 t __ZL53__arclite_NSMutableArray_setObject_atIndexedSubscriptP14NSMutableArrayP13objc_selectorP11objc_objectm 
0000000000002291 t __ZL58__arclite_NSMutableDictionary__setObject_forKeyedSubscriptP19NSMutableDictionaryP13objc_selectorP11objc_objectS4_ 
000000000000227f t __ZL58__arclite_NSMutableOrderedSet_setObject_atIndexedSubscriptP19NSMutableOrderedSetP13objc_selectorP11objc_objectm 
0000000000005888 b __ZL9Demangled 
0000000000005650 b __ZZL18add_image_hook_ARCPK11mach_headerlE7patches 
0000000000005780 b __ZZL22add_image_hook_swiftV1PK11mach_headerlE7patches 
0000000000005620 b __ZZL30add_image_hook_autoreleasepoolPK11mach_headerlE7patches 
       U ___CFConstantStringClassReference 
       U ___stack_chk_fail 
       U ___stack_chk_guard 
       U __dyld_register_func_for_add_image 
0000000000005260 s __non_lazy_classes 
       U __objc_empty_cache 
       U __objc_empty_vtable 
       U _asprintf 
       U _bzero 
       U _calloc 
       U _class_addMethod 
       U _class_addProperty 
       U _class_addProtocol 
       U _class_getInstanceMethod 
       U _class_getInstanceSize 
       U _class_getInstanceVariable 
       U _class_getIvarLayout 
       U _class_getName 
       U _class_getSuperclass 
       U _class_isMetaClass 
       U _class_replaceMethod 
       U _class_respondsToSelector 
       U _free 
       U _hash_create 
       U _hash_search 
0000000000001a30 t _hidden 
0000000000001a70 t _hidden2 
       U _ivar_getName 
       U _ivar_getOffset 
       U _kCFCoreFoundationVersionNumber 
       U _malloc 
       U _memcmp 
       U _memcpy 
       U _method_setImplementation 
0000000000001a00 T _not_hidden 
0000000000001a50 T _not_hidden2 
       U _objc_allocateClassPair 
       U _objc_autoreleasePoolPush 
       U _objc_collectingEnabled 
       U _objc_constructInstance 
       U _objc_copyClassNamesForImage 
       U _objc_getClass 
       U _objc_getMetaClass 
       U _objc_getProtocol 
       U _objc_getRequiredClass 
       U _objc_initializeClassPair 
       U _objc_lookUpClass 
       U _objc_msgSend 
       U _objc_readClassPair 
       U _objc_registerClassPair 
       U _objc_retain 
0000000000001a87 T _objc_retainedObject 
0000000000001a90 T _objc_unretainedObject 
0000000000001a99 T _objc_unretainedPointer 
       U _object_getClass 
       U _object_getIndexedIvars 
       U _object_getIvar 
       U _object_setIvar 
       U _printf 
       U _property_copyAttributeList 
       U _protocol_getMethodDescription 
       U _protocol_getName 
       U _pthread_mutex_lock 
       U _pthread_mutex_unlock 
       U _sel_getUid 
       U _strcmp 
       U _strlen 
       U _strncmp 
       U dyld_stub_binder 

注意,我已經離開了各種帶符號設置到其默認情況下,對於C文件符號,這似乎是正確的,如上面第一個nm輸出所示。

任何人都可以解釋爲什麼這是,也許建議一種方法來隱藏我不想暴露的Objective-C符號嗎?

更新:我在OSX 10.11.0上使用Xcode 7.0.1。

更新#2(更多的試驗):

  1. 包括.m文件中的項目導致的Xcode停止.c文件的編譯過程中通過-fvisibility=hidden,從而忽略了符號由默認構建設置隱藏。重複;在添加.m之前,這被傳遞給編譯器。
  2. 導出的符號文件設置爲包含_not_hidden_not_hidden2的文件不起任何作用。

在我看來,忽略符號由默認背後,是這個問題,使我對每一個函數和變量明確設置__attribute__((visibility("hidden"/"default")))(通過預處理宏)試驗的根本原因,它有沒有效果或者。這似乎牽連了連接器。

+0

後所顯示的整個符號表,或告訴我們您的關心的是。 –

+0

行,編輯。不知道爲什麼...... – Droppy

+0

請注意,儘管在添加ObjC代碼時出現了「隱藏」功能,但它們被標記爲「t」,這意味着本地。 'not_hidden'函數被標記爲'T',這意味着全局。 https://stackoverflow.com/q/3276474/269753 –

回答

4

有爲什麼你仍然看到一堆符號在你的dylib幾個原因:

1.您已設置(或沒有)的剝離模式下是沒有得到的一切是可以勝任的。

(嘗試調整在構建設置帶的款式,一般去除debugging symbols是好的,但是,我已經碰到它到Non-Global Symbols爲了這個目的,這很可能是約至於你可以把它。你dylib如果你決定剝離all symbols可能不會編譯,它將基本上使其不可在這一點上)

enter image description here

2.一些Objective-C的符號是絕對必要的。

(包括任何objc品種,其他如classpropertyobject等,因爲它們都支持運行時,是的仍有可能是相當多的存在)

3.您可能正在查看dylib的調試版本,而不是發行版本。

(請確保您正在尋找在發行版本的dylib的。這將是Product > Archive>Export。它然後應該很好地剝奪了大部分未實際使用的符號。


雖然只是使用了我在resulted in approximately 100+ fewer symbols以上顯示的設置,但您的文件中包含的符號確實不錯,但您可能需要稍微調整一下條形設置事實如果有的話問題,那麼它更有幫助。這是可以理解的,但如果你想刪除不相干或不使用的符號,只是混淆了事情。

+0

爲什麼只有C源文件的項目版本按預期工作,那麼只有當我開始使用Objective-C時,事情纔會發生急劇變化? – Droppy

+0

可見性控件僅適用於代碼的C或C++子集,但它們不適用於Objective-C類和方法。 Objective-C類和消息名稱由Objective-C運行時綁定,而不是由鏈接器綁定,因此可見性概念不適用。沒有任何機制可以從該庫的客戶端隱藏動態庫中定義的Objective-C類或方法。 –

+0

好的,我接受了你的答案,因爲剝離非全局符號是解決問題的方法。然而,我面臨的另一個問題是讓鏈接器實際執行剝離(請參閱下面的答案)。 – Droppy

0

OK,剝離非全局符號不解決這個問題,但是我無法設置在生成設置部署部分按正確順序(我嘗試過許多不同的連擊)。

我可以強制鏈接除去非全局符號的唯一辦法是把它添加到其它鏈接器標記

-Xlinker -x 
+0

除非啓用部署後處理,否則不會使用大部分「strip」構建設置。例如,請參閱[STRIP_INSTALLED_PRODUCT'的文檔](https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//apple_ref/doc/uid/TP40003931-CH3-SW4),並記下它的「夥伴」DEPLOYMENT_POSTPROCESSING。請參閱文檔以更清楚地解釋這是前者的先決條件。 –

+0

@KenThomases這是很好的信息,謝謝。預計任何後期處理都會破壞'.dylib'的代碼簽名?如果是這樣,那麼情況就不那麼有用了。 – Droppy

+0

這很奇怪,因爲我使用/不使用標誌得到相同的確切結果。 –

相關問題