Как узнать, где определяются символы при связывании кода C

Прежде всего public class Foo : IFoo<T> {} не компилируется, потому что вам нужно указать класс вместо T, но если вы сделаете что-то вроде public class Foo : IFoo<SomeClass> {}

, то если вы

Foo f = new Foo();
IBar<SomeClass> b = f as IBar<SomeClass>;

if(b != null)  //derives from IBar<>
    Blabla();
4
задан Mike Kinghan 19 March 2019 в 22:26
поделиться

2 ответа

Во время компоновки вы можете попросить компоновщика сообщить вам, в каком входном файле (объектный файл, член статической библиотеки или совместно используемая библиотека) он находит определение любого символа и в каких файлах он находит этот символ, на который ссылаются, используя опцию компоновщика. -trace-symbol=name .

Например:

$ cat main.c
extern void foo(void);

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

$ cat foo.c
#include <stdio.h>

void foo(void)
{
    fputs(__func__,stdout);
}

Скомпилировать источники:

$ gcc -Wall -c main.c foo.c

Создать статическую библиотеку:

$ ar rcs libfoo.a foo.o

Связать программу, запрашивающую трассировки символов для foo и fputs:

$ gcc -o prog main.o -L. -lfoo -Wl,-trace-symbol=foo,-trace-symbol=fputs
/usr/bin/ld: main.o: reference to foo
/usr/bin/ld: ./libfoo.a(foo.o): definition of foo
/usr/bin/ld: ./libfoo.a(foo.o): reference to fputs
/usr/bin/ld: //lib/x86_64-linux-gnu/libc.so.6: definition of fputs

Таким образом, foo определено в элементе архива foo.o из ./libfoo.a, а fputs определено в /lib/x86_64-linux-gnu/libc.so.6

0
ответ дан Mike Kinghan 19 March 2019 в 22:26
поделиться

Я только что написал сценарий в пятницу, чтобы сделать это почти точно. Этот скрипт находит как определенные, так и неопределенные ссылки на символ в данном каталоге:

#!/bin/bash
#findsym.sh
PATTERN=${1:-"symbol"}
OBJDUMP=armdir/arm-linux-gnuabi-objdump

for f in $(find . -name "*.so" -o -name "*.[ao]"); do
    ${OBJDUMP} -tT $f 2>/dev/null | grep -q ${PATTERN}  2>/dev/null
    [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 0 ]] || continue
    echo "FILE: $f"
    ${OBJDUMP} -tT $f | grep  ${PATTERN}
    echo
done

Использование:

 findsym.sh g_queue_pop_nth

Вам придется изменить путь к objdump, и если просматривая сгенерированные C ++ файлы, вы можете добавить -C к вашим флагам objdump.

0
ответ дан HardcoreHenry 19 March 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: