in realtà l'ordine di collegamento può essere dedotto utilizzando ldd; se libreria1 si trova nella riga di comando del linker prima della libreria2 quindi ldd visualizzerà la libreria1 prima della libreria2
Ora basato su questo ho scritto un breve script python che mostra le librerie condivise in ordine di collegamento - fa una prima ricerca di ampiezza su tutte le dipendenze visualizzate . da LDD (per un dato eseguibile
Ecco lo script
EDIT: notare che lo script utilizza LDD, comunque potrebbe essere utile ;-)
#!/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] ])
Grazie, ma ho bisogno di lavorare con arb programmi itrary, anche se non conosco la linea di collegamento con cui è stato compilato il programma. – atomice