OSX "ld" : 如何显示未解析符号的损坏名称?如何获取地图文件?

OSX "ld": how to show mangled names of unresolved symbols? how to get a map file?

本文关键字:损坏 文件 地图 何获取 获取 何显示 ld 显示 OSX 符号      更新时间:2023-10-16

在OS X 10.8.2(Mountain Lion)上,我试图使用libc++(而不是libstdc++)链接一个程序,而ld给了我一个未解决的符号错误

Undefined symbols for architecture x86_64:
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(char const*)", referenced from:
bool process_load_commands<mytype_t>(unsigned char*, ...) in module_mach_o.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这似乎是指以下行的代码生成:

mystdstring = ::std::string(mycharpointer + myint);

如果我将其更改为

mystdstring = mycharpointer + myint;

然后一切都很好,因为我们停止使用move构造函数,开始使用非move赋值运算符

我正试图追踪这件事,但由于缺乏传统工具,我受到了阻碍。我立刻想到两个问题:

  • 如何让ld生成映射文件?-map-Map-Wl,-map=foo-Wl,-Map=foo均不适用于此链接器。

    @(#)PROGRAM:ld  PROJECT:ld64-134.9
    configured to support archs: armv6 armv7 armv7s i386 x86_64
    LTO support using: LLVM version 3.1svn, from Apple Clang 4.1 (build 421.11.65)
    
  • 如何让ld向我显示未解析C++符号的未映射名称,以便我可以轻松地grep map/nm文件?

当然,如果有人以前见过这个特定的错误并知道如何修复,我也会接受这些答案。:)

编辑:我意识到我上面写的关于移动构造函数的内容毫无意义,因为症状在我写这个问题的过程中发生了变化P只要我对发生的事情有了更好的了解,我就会修复它。

编辑#2:错误消失了。我暂时指责我们自己构建的libc++:我的最佳猜测是,它中没有任何符号(由于为错误的拱门构建),我们非常幸运,除了这个函数,我们从未尝试过使用任何非内联函数。

不过,我对-map和显示被篡改的名称的问题仍然悬而未决。

要让clang为未解析的符号列表显示损坏的符号名称,请使用链接器/编译器标志:

-Xlinker --no-demangle

在libc++<string>标头中,basic_string::operator=(const char*)被声明/定义为:

_LIBCPP_INLINE_VISIBILITY basic_string& operator=(const_pointer __s) {return assign(__s);}

_LIBCPP_INLINE_VISIBILITY是一个扩展为"始终内联"answers"标记隐藏"的宏。因此,这个成员函数应该总是内联的,链接器永远不应该查找它

您是否偶然更改了_LIBCPP_INLINE_VISILITY宏的定义?