为什么无法从 Objective-C 个目标文件中隐藏符号?
Why is it impossible to hide symbols from Objective-C object files?
我正在编写一个小型动态库,它使用 Objective-C 并将 C 链接函数公开给 Unity(它是一个本机插件)。
即使我的编译器设置 Symbols Hidden by Default 设置为 Yes,并且我在我要公开的函数声明,甚至 static
符号(函数和全局变量)都出现在输出库中。
我重新创建了一个 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
请注意,我已将各种 条带符号 设置保留为默认设置,这对于第一个 nm
中所示的 C 文件符号似乎没问题上面的输出。
任何人都可以解释为什么会这样,也许可以建议一种隐藏我不想暴露的 Objective-C 符号的方法吗?
更新:我在 OSX 10.11.0.
上使用 Xcode 7.0.1
更新 #2(更多实验):
- 在项目中包含一个
.m
文件会导致 Xcode 在编译 .c
文件期间停止传递 -fvisibility=hidden
,从而忽略 符号默认情况下隐藏 构建设置。重复;在添加 .m
之前,这是传递给编译器的。
- 将导出的符号文件设置为包含
_not_hidden
和_not_hidden2
的文件没有任何效果。
在我看来,忽略默认隐藏的 符号 是问题的根本原因,所以我尝试明确设置 __attribute__((visibility("hidden"/"default")))
(通过预处理器宏)每一个函数和变量,它也没有效果。所以这似乎与链接器有关。
您仍然在 dylib
中看到一堆符号的原因有多种:
1.您设置(或未设置)的脱衣舞模式无法发挥其全部功能。
(尝试在构建设置中调整条带样式,通常删除 debugging symbols
没问题,但是,我为此目的将其提高到 Non-Global Symbols
,这可能是目前为止正如你所能接受的那样。如果你决定剥离 all symbols
,你的 dylib 可能不会编译,并且它基本上会导致它在那时无法使用)
2。一些 Objective-C 符号是绝对必需的。
(这些包括任何 objc
变种,以及其他如 class
、property
、object
等,因为它们都支持运行时,是的,现在仍然有很多)
3。您可能正在查看 dylib 的调试版本,而不是发布版本。
(确保您正在查看 release 版本的 dylib
。那将是 Product > Archive
> Export
。然后应该很好地去除大部分实际未使用的符号。
您可能需要稍微调整一下 strip 设置,尽管只使用我上面显示的设置 resulted in approximately 100+ fewer symbols 而不是当前在您的转储中显示的设置。将符号包含在文件中确实不错,事实上,如果出现问题,它会更有帮助。这是可以理解的,但如果你想删除不相关或未使用的符号,这些符号只会让事情变得混乱。
好的,剥离非全局符号确实解决了问题,但是我无法在 Build Settings 的 Deployment 部分中设置正确的顺序(我尝试了很多不同的组合)。
我可以强制链接器删除非全局符号的唯一方法是将其添加到 Other Linker Flags:
-Xlinker -x
我正在编写一个小型动态库,它使用 Objective-C 并将 C 链接函数公开给 Unity(它是一个本机插件)。
即使我的编译器设置 Symbols Hidden by Default 设置为 Yes,并且我在我要公开的函数声明,甚至 static
符号(函数和全局变量)都出现在输出库中。
我重新创建了一个 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
请注意,我已将各种 条带符号 设置保留为默认设置,这对于第一个 nm
中所示的 C 文件符号似乎没问题上面的输出。
任何人都可以解释为什么会这样,也许可以建议一种隐藏我不想暴露的 Objective-C 符号的方法吗?
更新:我在 OSX 10.11.0.
上使用 Xcode 7.0.1更新 #2(更多实验):
- 在项目中包含一个
.m
文件会导致 Xcode 在编译.c
文件期间停止传递-fvisibility=hidden
,从而忽略 符号默认情况下隐藏 构建设置。重复;在添加.m
之前,这是传递给编译器的。 - 将导出的符号文件设置为包含
_not_hidden
和_not_hidden2
的文件没有任何效果。
在我看来,忽略默认隐藏的 符号 是问题的根本原因,所以我尝试明确设置 __attribute__((visibility("hidden"/"default")))
(通过预处理器宏)每一个函数和变量,它也没有效果。所以这似乎与链接器有关。
您仍然在 dylib
中看到一堆符号的原因有多种:
1.您设置(或未设置)的脱衣舞模式无法发挥其全部功能。
(尝试在构建设置中调整条带样式,通常删除 debugging symbols
没问题,但是,我为此目的将其提高到 Non-Global Symbols
,这可能是目前为止正如你所能接受的那样。如果你决定剥离 all symbols
,你的 dylib 可能不会编译,并且它基本上会导致它在那时无法使用)
2。一些 Objective-C 符号是绝对必需的。
(这些包括任何 objc
变种,以及其他如 class
、property
、object
等,因为它们都支持运行时,是的,现在仍然有很多)
3。您可能正在查看 dylib 的调试版本,而不是发布版本。
(确保您正在查看 release 版本的 dylib
。那将是 Product > Archive
> Export
。然后应该很好地去除大部分实际未使用的符号。
您可能需要稍微调整一下 strip 设置,尽管只使用我上面显示的设置 resulted in approximately 100+ fewer symbols 而不是当前在您的转储中显示的设置。将符号包含在文件中确实不错,事实上,如果出现问题,它会更有帮助。这是可以理解的,但如果你想删除不相关或未使用的符号,这些符号只会让事情变得混乱。
好的,剥离非全局符号确实解决了问题,但是我无法在 Build Settings 的 Deployment 部分中设置正确的顺序(我尝试了很多不同的组合)。
我可以强制链接器删除非全局符号的唯一方法是将其添加到 Other Linker Flags:
-Xlinker -x