为什么不可能从Objective-C目标文件中隐藏符号?

滴滴

我正在编写一个使用Objective-C的小型动态库,并将C链接功能向Unity公开(这是一个本机插件)。

即使我的编译器设置将“默认情况下隐藏的符号”设置为“是”,并且我正在使用__attribute__((visibility("default")))要公开的函数声明,即使static符号(函数和全局变量)也出现在输出库中。

我已经重新创建了一个测试Xcode项目,该项目最初包含一个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

但是,一旦我添加了具有类似功能的Objective-C文件(not_hidden2(),等),所有的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-fvisibility=hidden.c文件编译期间停止传递,从而忽略“默认隐藏符号”构建设置。重复; 在添加之前,将其.m传递给编译器。
  2. 将“导出的符号文件”设置为包含_not_hidden并且_not_hidden2没有任何作用的文件

在我看来,忽略默认隐藏的符号是问题的根本原因,因此我尝试__attribute__((visibility("hidden"/"default")))对每个单个函数和变量(通过预处理器宏)进行显式设置,但也没有任何效果。因此,这似乎暗示了链接器。

'

有几个原因导致您仍然在您的帐户中看到一堆符号dylib

1.您设置(或不设置)的剥离模式无法获得它所能提供的一切。

(尝试在构建设置中调整条形样式,通常可以将其移除debugging symbols,但是Non-Global Symbols为此,我将其设置最大,这可能是您可以接受的。如果您使用dylib,则可能无法编译决定剥离all symbols,这实际上会使它在该点上不可用)

在此处输入图片说明

2.绝对需要一些Objective-C符号。

(这包括任何的objc品种,其他如classpropertyobject,等,因为它们都支持运行,并且是有可能仍然是相当多的存在)

3.您可能正在查看的是dylib的调试版本,而不是发行版。

(确保您正在查看的发行dylib。应该是Product > Archive> Export。然后应该很好地去除大多数未实际使用的符号。


尽管仅使用上面显示的设置,转储设置会比当前显示的转储符号少大约100多个,但您可能需要稍微练习一下条带设置在文件中包含符号确实很不错,实际上,如果有问题,那么它会更有帮助。这是可以理解的,但是如果您想删除不相关或未使用的符号,只会使事情变得混乱。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在C中不可能重载?

来自分类Dev

为什么在Haskell中不可能分割整数?

来自分类Java

为什么在C#泛型中这是不可能的?

来自分类Javascript

为什么不可能从原型更改构造函数?

来自分类Java

为什么我不可能写入到一个文件?

来自分类Dev

为什么在Scala中不可能将变量与`to`一起使用?

来自分类Dev

为什么在Kotlin中不可能使用对`suspend`函数的方法引用?

来自分类Dev

为什么不可能在特征中定义此构造函数?

来自分类Dev

为什么在 VB.NET 中不可能声明一个 NotOverridable 方法?

来自分类Dev

如何在部分模板中设置@key?(或者为什么不可能?)

来自分类Dev

为什么要在Typescript中创建不可能的交集类型?

来自分类Dev

为什么在Python中不可能实现真正的不变性?

来自分类Dev

为什么可以在TypeScript中将接口中可能的数字值转换为类实现中的不可能的数字值?

来自分类Dev

为什么直接使用泛型值是不可能的,但如果从 Dart 中的方法返回也是可能的

来自分类Dev

究竟什么是目标文件中的符号引用?

来自分类Dev

不可能从 pl/sql 中的空值获取 NULL

来自分类Dev

在C ++中,是否真的不可能跳过带有默认参数的模板参数,为什么语法建议否则呢?

来自分类Java

为什么在Java中不可能在内部匿名类中引用非最终变量?

来自分类Dev

为什么不可能构建可以确定C ++函数是否会更改特定变量的值的编译器?

来自分类Dev

什么是C中的目标文件?

来自分类Dev

为什么 Typescript 在 useMemo 中说 X 可能是未定义的,而此时它永远不可能是未定义的

来自分类Dev

为什么在python中不可能有一个object方法返回一个元组作为新对象__init__方法中的参数?

来自分类Dev

为什么在python中不可能有一个object方法返回一个元组作为新对象__init__方法中的参数?

来自分类Dev

C链表中不可能的结果

来自分类Dev

在垒中同时具有传输级安全性和消息级安全性是不可能的吗?为什么?

来自分类Dev

不可能返回数组在C中实际上意味着什么?

来自分类Dev

拦截文件流...不可能吗?

来自分类Dev

为什么内部链接的名称会出现在目标文件的符号表中?

来自分类Dev

如果我从带条纹的RAID0中删除一个硬盘,是否不可能从剩余的硬盘中读取数据?

Related 相关文章

  1. 1

    为什么在C中不可能重载?

  2. 2

    为什么在Haskell中不可能分割整数?

  3. 3

    为什么在C#泛型中这是不可能的?

  4. 4

    为什么不可能从原型更改构造函数?

  5. 5

    为什么我不可能写入到一个文件?

  6. 6

    为什么在Scala中不可能将变量与`to`一起使用?

  7. 7

    为什么在Kotlin中不可能使用对`suspend`函数的方法引用?

  8. 8

    为什么不可能在特征中定义此构造函数?

  9. 9

    为什么在 VB.NET 中不可能声明一个 NotOverridable 方法?

  10. 10

    如何在部分模板中设置@key?(或者为什么不可能?)

  11. 11

    为什么要在Typescript中创建不可能的交集类型?

  12. 12

    为什么在Python中不可能实现真正的不变性?

  13. 13

    为什么可以在TypeScript中将接口中可能的数字值转换为类实现中的不可能的数字值?

  14. 14

    为什么直接使用泛型值是不可能的,但如果从 Dart 中的方法返回也是可能的

  15. 15

    究竟什么是目标文件中的符号引用?

  16. 16

    不可能从 pl/sql 中的空值获取 NULL

  17. 17

    在C ++中,是否真的不可能跳过带有默认参数的模板参数,为什么语法建议否则呢?

  18. 18

    为什么在Java中不可能在内部匿名类中引用非最终变量?

  19. 19

    为什么不可能构建可以确定C ++函数是否会更改特定变量的值的编译器?

  20. 20

    什么是C中的目标文件?

  21. 21

    为什么 Typescript 在 useMemo 中说 X 可能是未定义的,而此时它永远不可能是未定义的

  22. 22

    为什么在python中不可能有一个object方法返回一个元组作为新对象__init__方法中的参数?

  23. 23

    为什么在python中不可能有一个object方法返回一个元组作为新对象__init__方法中的参数?

  24. 24

    C链表中不可能的结果

  25. 25

    在垒中同时具有传输级安全性和消息级安全性是不可能的吗?为什么?

  26. 26

    不可能返回数组在C中实际上意味着什么?

  27. 27

    拦截文件流...不可能吗?

  28. 28

    为什么内部链接的名称会出现在目标文件的符号表中?

  29. 29

    如果我从带条纹的RAID0中删除一个硬盘,是否不可能从剩余的硬盘中读取数据?

热门标签

归档