OSX & lt; ld & quot; как отображать искаженные имена неразрешенных символов? как получить файл карты?

В 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)

Похоже, что это относится к codegen для следующей строки:

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

Если я изменю это на

mystdstring = mycharpointer + myint;

тогда все работает нормально, потому что мы прекращаем использовать конструктор перемещения и начинаем использовать оператор присваивания без перемещения.

Я пытаюсь отследить это, но мне мешает отсутствие моих традиционных инструментов. На ум сразу приходят два вопроса:

  • Как я могу получить 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 ++, чтобы я мог легко получить файл map / nm?

И, конечно, если кто-то уже видел эту конкретную ошибку и знает, как ее исправить, я тоже приму эти ответы. 🙂

РЕДАКТИРОВАТЬ: я понимаю, что то, что я написал выше о конструкторах перемещения, не имеет смысла, потому что симптом изменился в середине моего написания этого вопроса. : P Я исправлю это всякий раз, когда получу лучшее представление о том, что происходит.

РЕДАКТИРОВАТЬ # 2: ошибка исчезла. Я осторожно виню нашу самодельную libc ++: я думаю, что она не имела любой символы в нем (из-за построения для неправильной арки), и нам просто повезло, что мы никогда не пытались использовать какие-либо не встроенные функции, кроме этой.

Мои вопросы о -map и показ искалеченных имен все еще открыт, хотя.

1

Решение

Чтобы clang отображал искаженные имена символов для списка неразрешенных символов, используйте флаги компоновщика / компилятора:

-Xlinker --no-demangle
1

Другие решения

В 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?

0

По вопросам рекламы [email protected]