什么是$ $ LD加$ os10.4 $前缀的意思是,当我用纳米来看看在Mac上符号列表?(what

2019-09-16 12:15发布

我有一些问题,我的iPhone应用程序不连接的iPhone模拟器。 它告诉我有未定义的符号:

Undefined symbols for architecture i386:
  ".objc_class_name_NSRunLoop", referenced from:
      pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
  ".objc_class_name_NSDate", referenced from:
      pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
  ".objc_class_name_NSAutoreleasePool", referenced from:
      pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
      pointer-to-literal-objc-class-name in libRenderSystem_GLES2Static.a(OgreEAGL2Window.mm.o)
  ".objc_class_name_UIApplication", referenced from:
      pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
      pointer-to-literal-objc-class-name in libOIS.a(iPhoneInputManager.mm.o)
  ".objc_class_name_NSObject", referenced from:
      .objc_class_name_AppDelegate in SampleBrowser.cpp.o
  ".objc_class_name_UIView", referenced from:
      .objc_class_name_SampleBrowserGestureView in SampleBrowser.cpp.o
      .objc_class_name_InputDelegate in libOIS.a(iPhoneInputManager.mm.o)
      .objc_class_name_EAGL2View in libRenderSystem_GLES2Static.a(OgreEAGL2View.mm.o)
  ".objc_class_name_UIScreen", referenced from:
      pointer-to-literal-objc-class-name in libOIS.a(iPhoneInputManager.mm.o)
      pointer-to-literal-objc-class-name in libRenderSystem_GLES2Static.a(OgreEAGL2Support.mm.o)
  ".objc_class_name_UIAccelerometer", referenced from:
      pointer-to-literal-objc-class-name in libOIS.a(iPhoneInputManager.mm.o)
      pointer-to-literal-objc-class-name in libOIS.a(iPhoneAccelerometer.mm.o)

但这些看起来像Objective-C类的从对此链接到的框架的名称。 我想要做一些挖掘周围,所以我用纳米来看看我链接到的框架的符号列表。 例如

josh$ nm /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/Foundation.framework/Foundation -arch i386 -g | grep objc_class
001a4500 S $ld$add$os10.4$.objc_class_name_NSArray
001a4501 S $ld$add$os10.4$.objc_class_name_NSCalendar
001a4502 S $ld$add$os10.4$.objc_class_name_NSData
001a4503 S $ld$add$os10.4$.objc_class_name_NSDate
001a4504 S $ld$add$os10.4$.objc_class_name_NSDateComponents
001a4505 S $ld$add$os10.4$.objc_class_name_NSDictionary
001a4506 S $ld$add$os10.4$.objc_class_name_NSEnumerator
001a4507 S $ld$add$os10.4$.objc_class_name_NSException
001a4508 S $ld$add$os10.4$.objc_class_name_NSInputStream
001a4509 S $ld$add$os10.4$.objc_class_name_NSInvocation
001a450a S $ld$add$os10.4$.objc_class_name_NSLocale
001a450b S $ld$add$os10.4$.objc_class_name_NSMethodSignature
001a450c S $ld$add$os10.4$.objc_class_name_NSMutableArray
001a450d S $ld$add$os10.4$.objc_class_name_NSMutableData
001a450e S $ld$add$os10.4$.objc_class_name_NSMutableDictionary
001a450f S $ld$add$os10.4$.objc_class_name_NSMutableSet
001a4510 S $ld$add$os10.4$.objc_class_name_NSNull
001a4511 S $ld$add$os10.4$.objc_class_name_NSObject
001a4512 S $ld$add$os10.4$.objc_class_name_NSOutputStream
001a4513 S $ld$add$os10.4$.objc_class_name_NSRunLoop
001a4514 S $ld$add$os10.4$.objc_class_name_NSSet
001a4515 S $ld$add$os10.4$.objc_class_name_NSStream
001a4516 S $ld$add$os10.4$.objc_class_name_NSTimeZone
001a4517 S $ld$add$os10.4$.objc_class_name_NSTimer
001a4548 S $ld$add$os10.4$.objc_class_name_NSURL
001a4518 S $ld$add$os10.4$.objc_class_name_NSUserDefaults
001a4549 S $ld$add$os10.5$.objc_class_name_NSURL
001a454a S $ld$hide$os10.4$.objc_class_name_NSFileWrapper
001a454b S $ld$hide$os10.5$.objc_class_name_NSFileWrapper
001a454c S $ld$hide$os10.6$.objc_class_name_NSFileWrapper

现在,这个符号列表使得它看起来对我来说,这一框架的存档导出链接器正在寻找类。 这是唯一不同的是这个$ LD $加$ os10.4 $前缀。 我不知道为什么它的存在,这是什么意思,是,也许,导致我的问题吗?

编辑:看来,这是我的问题, 针对iPhoneSimulator当在Xcode链接错误

总之,在离开关闭编译器标志-fobjc-ABI-版本= 2通向不同的符号命名。

Answer 1:

$ld$add$osXX.X$SYMBOL是连接指令,允许一个符号解析重定向在库中。 命令坐落在一个二进制的__DATA部,并通过解析ld在链接时改变导出的符号的可见性。 在OS X上的连接器实际上接受相当多的不同类型的这些命令:

$ld$hide$osXX.X$SYMBOL添加一个符号忽略设置。 链接器将那个符号不再出口,与库链接任何二进制文件,即使它可能具有全球知名度。

$ld$add$osXX.X$SYMBOL添加一个符号在链接时二进制不管是否存在一个定义。

$ld$install_name$osXX.X重定向在一个特定的二进制到另一个二进制符号的定义。 这是用来解决在OS X上的问题,即使用CoreGraphics的存在作为ApplicationServices的子框架。 所有符号现在重定向绕到适当的框架。

$ld$compatibility_version部队与早期版本的链接器的兼容性。

在你的情况,你撞到了针对基金会的兼容性问题。 OS X出口NSFileWrapper在了AppKit,直到10.7当符号被隐藏从那里搬到了基础。 通常,这意味着了AppKit的作者会隐藏_OBJC_CLASS_ $,$ _OBJC_METACLASS_,并定义一个类_OBJC_IVAR_ $部件,使连接器别处寻找那象征。 但是,因为你删除的-fobjc-abi-version标志的编译器的默认回老1.x的ABI只需要的隐藏和发现.objc_class_name这可能不会在你要连结的二进制存在。

至于你的未定义的符号,这是一个简单的文件扩展名的问题。 的.cpp是C ++ 只是文件,(这意味着没有NSRunloop,MSMutableArray,NSObject的,等等)。 如果要访问这些对象,重命名问题的文件扩展名为.mm,这是一个标准objC ++文件。 这也是一个好主意,对链接和进口QuartzCore(用于EAGL2View)和UIKit(用于UIScreen与UIAccelerometer一起的朋友)。



Answer 2:

我真的不避让在iOS SDK,但你为什么要编制的“I386”? 而与PhoneGap的打我就遇到了这个问题类似几天前的晚上。 我只是从我的XCode项目设置中删除“I386”一切似乎在后模拟器做工精细。 尽管我可能是错的。



文章来源: what does the $ld$add$os10.4$ prefix mean when I use nm to look at a symbol list on a Mac?