OSX“ld”:如何显示未解析符号的错位名称?如何获取地图文件?

时间:2012-11-19 22:26:42

标签: c++ c++11 clang ld libc++

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

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)

这似乎是指以下行的codegen:

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

如果我将其更改为

mystdstring = mycharpointer + myint;

然后一切正常,因为我们停止使用move-constructor并开始使用非移动赋值运算符。

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

  • 如何让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的问题以及显示错位名称的问题仍然存在。

2 个答案:

答案 0 :(得分:1)

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

-Xlinker --no-demangle

答案 1 :(得分:0)

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

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

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

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