Как найти определение внешней функции

Я собираю большой проект. В этом проекте используются общие библиотеки, особенно lapack.

Я хотел бы быть уверенным, для данной функции, в какой разделяемой библиотеке система ее находит.

Здесь вывод нм:

$ nm -DC ~/bin/app | grep potrf
                 U dpotrf_

Как и ожидалось, dpotrf_ не определено.

Вот результат с objdump:

$ objdump -TR  ~bin/app | grep potrf
0000000000925428 R_X86_64_JUMP_SLOT  dpotrf_

Так objdump найти что-нибудь! Есть ли возможность показать, в какой общей библиотеке он ее находит? Или другая программа для этого?


person Jérôme    schedule 12.11.2010    source источник
comment
Что показывает ldd для ~/bin/app   -  person jim mcnamara    schedule 12.11.2010
comment
ldd хорошо показывает библиотеки mkl. Это пример, мне нужен метод для тех случаев, когда я не знаю, откуда берется функция.   -  person Jérôme    schedule 12.11.2010


Ответы (1)


ldd определенно является отправной точкой для поиска библиотек-кандидатов. Вот что у меня есть в моем .bashrc для таких целей (некрасиво, но служит моим целям).

По сути, я выполняю nm для всех библиотек (.a, .so) в подкаталоге. Если nm выдает искомый символ, я печатаю имя библиотеки и соответствующие строки из nm. Последним вашим шагом будет поиск строк, начинающихся с «T», поскольку именно они определяют ваш символ как программный код (текст).

# run nm on a set of objects (ending with the 1st parameter) and
# grep the output for the 2nd parameter
function nmgrep ()
{
    for i in $( find \. -name \*$1 ); do
        if [[ ! -e $i ]]; then
            continue;
        fi  
        nm $i | grep $2 > /tmp/foo.tmp;
        if [[ -s /tmp/foo.tmp ]]; then
            echo $i; 
            cat /tmp/foo.tmp | grep $2
        fi  
        rm /tmp/foo.tmp
    done  
}

# find symbols definied/referenced in libs
function libgrep ()
{
    nmgrep .a $@
    nmgrep .so $@
}
person BjoernD    schedule 12.11.2010