Найти объектный файл, вызывающий зависимость - PullRequest
0 голосов
/ 23 декабря 2018

Я в некоторой исключительной ситуации: у меня есть приложение, которое компилирует, связывает и запускает при компиляции с MSVC.Сейчас я нахожусь в процессе перекомпиляции его clang-cl, что приводит к его компиляции, связыванию и аварийному завершению.

Благодаря Dependency Walker я обнаружил, что загружаются неожиданные библиотеки DLL.В моем случае, чтобы найти символ для std::allocator<char>::allocator(allocator const &).

С этим, у меня в настоящее время есть следующая информация:

  • DLL, требующая этот символ
  • DLLразоблачение символа
  • Символ, который вызывает проблемы

Чтобы зарегистрировать ошибку, я должен иметь возможность уменьшить код до приемлемого размера.Загрузка всей базы проприетарного кода невозможна, загрузка 20-строчного файла .cpp:

Чтобы сократить, мне нужно найти файл .cpp / .obj, для которого требуется этот символ.Отсюда его уменьшение становится легкой работой.

С этим я ищу способ определить, ищет ли файл .obj символ в другой DLL.

I 'мы уже нашли:

  • dumpbin / SYMBOLS: сообщает, куда экспортируется символ
  • dumpbin / DEPENDENTS: сообщает DLL, от чего зависит DLL,

dumpbin /DEPENDENTS состояния:

Выводит ли не имена импортированных функций.

Как сделать дампимена импортированных функций, основанные на файле .obj?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

dumpbin /symbols действительно правильный инструмент для задания, так как в нем также перечислены неопределенные символы.

Например, при использовании dumpbin /symbols для печати символов в объектном файле, созданном из исходного файла, содержащего

void foo();

void bar() {
    foo();
}

мы получаем

File Type: COFF OBJECT

COFF SYMBOL TABLE
[...]
008 00000000 UNDEF  notype ()    External     | ?foo@@YAXXZ (void __cdecl foo(void))
009 00000000 SECT3  notype ()    External     | ?bar@@YAXXZ (void __cdecl bar(void))
[...]

Как видите, он содержит как символ для определенной функции bar, так и символ для функции foo, который просто объявлен.Разница в том, что для bar он говорит, что символ можно найти в SECT3, тогда как для foo он печатает UNDEF.

Таким образом, чтобы найти все символы, импортированные откуда-то еще(например, DLL), вам просто нужно найти UNDEF в выводе dumpbin /symbols.

0 голосов
/ 26 декабря 2018

Если вы используете, например,

dumpbin /symbols Source.obj >dump.txt

Он будет выгружать объект COFF и везде, где он говорит Внешний и UNDEF, связанный должен найти эти внешние символы.

Я создалНебольшой пример, который зависит от

void foo();
int main()
{
    foo();
}

и может видеть это в файле дампа

01B 00000000 UNDEF  notype ()    External     | ?foo@@YAXXZ (void __cdecl foo(void))

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

Формат COFF описан здесь

...