当我使用nm查看Mac上的符号列表时,$ ld $ add $ os10.4 $前缀是什么意思? [英] what does the $ld$add$os10.4$ prefix mean when I use nm to look at a symbol list on a Mac?

查看:161
本文介绍了当我使用nm查看Mac上的符号列表时,$ ld $ add $ os10.4 $前缀是什么意思?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的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)

但是这些看起来就像是我 AM 所针对的框架中的Objective-C类的名称.我想进行一些挖掘,因此我使用nm来查看要链接的框架的符号列表.例如

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

现在,此符号列表使我看起来像框架存档IS正在导出链接程序正在寻找的类.唯一不同的是此$ ld $ add $ os10.4 $前缀.我想知道为什么它在那里,这意味着什么,也许是造成我的问题吗?

看起来这是我的问题: 定位到iPhoneSimulator时Xcode中的链接错误

简而言之,省略编译器标志-fobjc-abi-version = 2会导致不同的符号命名.

解决方案

$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强制与早期版本的链接器兼容.

在您的情况下,您遇到了Foundation中的兼容性问题. OS X将AppFile中的NSFileWrapper导出到10.7,直到该符号从那里隐藏并移至Foundation.通常,这意味着AppKit的作者将隐藏类定义的_OBJC_CLASS _ $,_ OBJC_METACLASS_ $和_OBJC_IVAR_ $部分,以使链接程序在该符号的其他地方查找.但是,由于删除了-fobjc-abi-version标志,因此编译器默认返回到旧的1.x ABI,它只需要隐藏和查找.objc_class_name,而您尝试链接的二进制文件中可能不存在.objc_class_name./p>

对于您未定义的符号,这是一个简单的文件扩展名问题. .cpp是仅用于c ++ 的文件(这意味着没有NSRunloop,MSMutableArray,NSObject等).如果要访问这些对象,请使用扩展名.mm重命名有问题的文件,这是标准的objC ++文件.链接并导入QuartzCore(用于EAGL2View)和UIKit(用于UIScreen和朋友以及UIAccelerometer)也是一个好主意.

I'm having some problems with my iPhone app not linking for the iPhone Simulator. It tells me there are undefined symbols:

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)

But these looks like the names of Objective-C classes from frameworks which I AM linking against. I wanted to do some digging around so I used nm to look at the symbol list of the frameworks I'm linking against. For instance

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

Now, this symbol list makes it look to me like that framework archive IS exporting the classes that the linker is looking for. The only thing that's different is this $ld$add$os10.4$ prefix. I'm wondering why it's there, what it means, and is that, perhaps, causing my problem?

Edit: Looks like this was my problem: Link errors in Xcode when targeting iPhoneSimulator

In short, leaving off the compiler flag -fobjc-abi-version=2 leads to the different symbol naming.

解决方案

$ld$add$osXX.X$SYMBOL is a linker directive that allows one to redirect symbol resolution in a library. The command sits in the __DATA section of a binary and is parsed by ld at link time to change the visibility of exported symbols. The linker on OS X actually accepts quite a few different kinds of these commands:

$ld$hide$osXX.X$SYMBOL Adds that symbol to the ignore set. The Linker will no longer export that symbol to any binaries that link with the library even though it may have global visibility.

$ld$add$osXX.X$SYMBOL Adds that symbol to the binary at link time regardless of whether a definition exists.

$ld$install_name$osXX.X Redirects the definition of a symbol in a particular binary to another binary. This is used to work around an issue in OS X where CoreGraphics used to exist as a sub-framework of ApplicationServices. All symbols are now redirected around to the proper framework.

$ld$compatibility_version Forces compatibility with earlier versions of the Linker.

In your case, you've bumped up against a compatibility issue in Foundation. OS X exported NSFileWrapper in AppKit until 10.7 when the symbol was hidden from there and moved to Foundation. Normally, this means the author of AppKit would hide the _OBJC_CLASS_$, _OBJC_METACLASS_$, and _OBJC_IVAR_$ parts of a class definition to make the linker look elsewhere for that symbol. However, because you removed the -fobjc-abi-version flag the compiler defaults back to the old 1.x ABI which only requires the hiding and finding of a .objc_class_name which probably don't exist in the binary you're trying to link.

As for your undefined symbols, it's a simple file extension issue. .cpp are c++ only files, (which means no NSRunloop, MSMutableArray, NSObject, etc). If you wish to access these objects, rename the offending files with the extension .mm, which is a standard objC++ file. It's also a good idea to link against and import QuartzCore (for EAGL2View) and UIKit (for UIScreen and friends along with UIAccelerometer).

这篇关于当我使用nm查看Mac上的符号列表时,$ ld $ add $ os10.4 $前缀是什么意思?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆