Как найти определение внешней функции - PullRequest
0 голосов
/ 12 ноября 2010

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

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

Вот вывод nm:

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

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

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

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

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

1 Ответ

3 голосов
/ 12 ноября 2010

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 $@
}
...