菜鸟教程小白 发表于 2022-12-11 22:41:00

ios - 当我使用 nm 查看 Mac 上的符号列表时,$ld$add$os10.4$ 前缀是什么意思?


                                            <p><p>我的 iPhone 应用程序无法链接到 iPhone 模拟器时遇到一些问题。它告诉我有 undefined symbol :</p>

<pre><code>Undefined symbols for architecture i386:
&#34;.objc_class_name_NSRunLoop&#34;, referenced from:
      pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
&#34;.objc_class_name_NSDate&#34;, referenced from:
      pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
&#34;.objc_class_name_NSAutoreleasePool&#34;, 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)
&#34;.objc_class_name_UIApplication&#34;, referenced from:
      pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
      pointer-to-literal-objc-class-name in libOIS.a(iPhoneInputManager.mm.o)
&#34;.objc_class_name_NSObject&#34;, referenced from:
      .objc_class_name_AppDelegate in SampleBrowser.cpp.o
&#34;.objc_class_name_UIView&#34;, 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)
&#34;.objc_class_name_UIScreen&#34;, 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)
&#34;.objc_class_name_UIAccelerometer&#34;, 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)
</code></pre>

<p>但这些看起来像我 <em>AM</em> 链接的框架中的 Objective-C 类的名称。我想做一些挖掘工作,所以我使用 nm 查看我链接的框架的符号列表。比如</p>

<pre><code>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
</code></pre>

<p>现在,这个符号列表让我觉得框架文件正在导出链接器正在寻找的类。唯一不同的是这个 $ld$add$os10.4$ 前缀。我想知道它为什么会出现,这意味着什么,这是否可能导致了我的问题?</p>

<p>编辑:
看起来这是我的问题:
<a href="https://stackoverflow.com/questions/5010175/link-errors-in-xcode-when-targeting-iphonesimulator" rel="noreferrer noopener nofollow">Link errors in Xcode when targeting iPhoneSimulator</a> </p>

<p>简而言之,省略编译器标志 -fobjc-abi-version=2 会导致符号命名不同。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>$ld$add$osXX.X$SYMBOL</code> 是一个链接器指令,允许重定向库中的符号解析。该命令位于二进制文件的 __DATA 部分,并在链接时由 <code>ld</code> 解析以更改导出符号的可见性。 OS X 上的链接器实际上接受了很多不同类型的这些命令:</p>

<p><code>$ld$hide$osXX.X$SYMBOL</code> 将该符号添加到忽略集中。链接器将不再将该符号导出到与库链接的任何二进制文件,即使它可能具有全局可见性。</p>

<p><code>$ld$add$osXX.X$SYMBOL</code> 在链接时将该符号添加到二进制文件中,无论是否存在定义。</p>

<p><code>$ld$install_name$osXX.X</code> 将特定二进制文件中的符号定义重定向到另一个二进制文件。这用于解决 OS X 中 CoreGraphics 曾经作为 ApplicationServices 的子框架存在的问题。所有符号现在都被重定向到正确的框架。</p>

<p><code>$ld$compatibility_version</code> 强制与早期版本的链接器兼容。</p>

<p>就您而言,您遇到了 Foundation 中的兼容性问题。 OS X 将 NSFileWrapper 导出到 AppKit 中,直到 10.7 之后该符号从那里隐藏并移至 Foundation。通常,这意味着 AppKit 的作者会隐藏类定义的 _OBJC_CLASS_$、_OBJC_METACLASS_$ 和 _OBJC_IVAR_$ 部分,以使链接器在别处查找该符号。但是,由于您删除了 <code>-fobjc-abi-version</code> 标志,编译器默认返回旧的 1.x ABI,它只需要隐藏和查找 <code>.objc_class_name</code>您尝试链接的二进制文件中可能不存在。</p>

<p>至于您 undefined symbol ,这是一个简单的文件扩展名问题。 .cpp 是 c++ <strong><em>only</em></strong> 文件,(这意味着没有 NSRunloop、MSMutableArray、NSObject 等)。如果您希望访问这些对象,请将有问题的文件重命名为扩展名为 .mm,这是一个标准的 objC++ 文件。链接并导入 QuartzCore(用于 EAGL2View)和 UIKit(用于 UIScreen 和 friend 以及 UIAccelerometer)也是一个好主意。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 当我使用 nm 查看 Mac 上的符号列表时,$ld$add$os10.4$ 前缀是什么意思?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/10134189/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/10134189/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 当我使用 nm 查看 Mac 上的符号列表时,$ld$add$os10.4$ 前缀是什么意思?