В каком порядке ld-linux.so ищет общие библиотеки? - PullRequest
9 голосов
/ 01 сентября 2010

Когда ld-linux разрешает символ, он ищет в общих библиотеках в определенном порядке и останавливается, когда находит общую библиотеку с соответствующим символом.

Что определяет порядок поиска в библиотеках?Имеет ли это значение, если неразрешенный символ находится в основной программе или в другой общей библиотеке?

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

Ответы [ 3 ]

9 голосов
/ 01 сентября 2010

С http://www.muppetlabs.com/~breadbox/software/ELF.txt (как упомянуто Сарнольдом):

При разрешении символических ссылок, динамический компоновщик проверяет символ таблицы с поиском в ширину. То есть сначала смотрит на символ таблица исполняемой программы сам, то в таблицах символов записи DT_NEEDED (по порядку), затем на втором уровне DT_NEEDED записей, и т. д.

3 голосов
/ 01 сентября 2010

В этой книге http://www.network -theory.co.uk / docs / gccintro / gccintro_18.html предлагается порядок слева направо, заданный в командной строке gcc.(Я давно научился всегда ставить -lm в качестве самой последней библиотеки в списке библиотек, с которыми можно связываться, но я также давно забыл причину культа груза для этого.)

РЕДАКТИРОВАТЬ

Ага, спасибо за обновление.Вам нужно будет разобрать ELF самостоятельно;поищите «Зависимости общих объектов» и «DT_RPATH» в http://www.muppetlabs.com/~breadbox/software/ELF.txt. (я также рекомендую http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html,, но он менее применим к вашей проблеме - просто увлекательное чтение.)

/usr/include/linux/elf.h имеет все typedefs.

0 голосов
/ 14 мая 2015

на самом деле порядок ссылок можно определить с помощью ldd;если библиотека1 находится в командной строке компоновщика перед библиотекой2, то ldd будет отображать библиотеку1 перед библиотекой2

Теперь, основываясь на этом, я написал короткий скрипт на python, который показывает общие библиотеки в порядке ссылок - сначала выполняется поиск по всем зависимостямотображается ldd (для данного исполняемого файла.

Вот сценарий

EDIT: обратите внимание, что сценарий использует ldd, все еще может быть полезным; -)

#!/usr/bin/python

import subprocess
import sys
import re

visited_so = {}
ssplit = re.compile('\S+')
verbose = 0

def run_ldd( sopath ):
        ret = []

        pop = subprocess.Popen( [ 'ldd', sopath ], stdin = subprocess.PIPE, stdout = subprocess.PIPE)
        [out, err] = pop.communicate()

        for l in out.splitlines():
            toks = ssplit.findall( l )
            if len(toks) > 3:
                ret.append( toks[2] )
        return ret

def load_order_bfs( pqueue ):
    while len(pqueue) != 0:
        nextexe = pqueue.pop(0)
        if verbose:
            print 'visit ' + nextexe

        if not nextexe in visited_so:
            print nextexe
            visited_so[ nextexe ] = 1

            dependents = run_ldd( nextexe )
            for sopath in dependents:
                    if not sopath in visited_so:
                        if verbose:
                            print '\tnext ' + sopath
                        pqueue.append( sopath )

if len( sys.argv ) == 1:
    print sys.argv[0] + """ <path>
shows dependents of executable in symbol search order;
does a breadth first search over the dependents of the executable
"""
    sys.exit(1)

load_order_bfs( [ sys.argv[1] ] )       
...