2012-02-08 16 views
5

Sto provando a creare una grande libreria statica che unisce due librerie statiche. Nel momento in cui sto usando il comando 'ar', l'estrazione di oggetti, ad esempio, da 'AA' e 'ba' e poi riassemblare questi oggetti usando 'ar' ancora:Come posso estrarre librerie statiche contenenti file oggetto ripetuti?

$ ar x a.a 
$ ar x b.a 
$ ar r merged.a *.o 

Purtroppo non funziona per il mio scopo, dal momento che aa ha all'interno diversi oggetti con lo stesso NOME. Il comando 'ar' sta estraendo gli oggetti ripetuti e sostituendo quelli già estratti con lo stesso nome. Anche con lo stesso nome, questi oggetti hanno simboli diversi, quindi ottengo riferimenti indefiniti poiché alcuni simboli vengono persi insieme ai file sostituiti.

Non ho accesso agli oggetti originali e ho già provato 'ar xP' e 'ar xv' e un sacco di 'ar stuff'. Qualcuno può aiutarmi a mostrare come unire queste librerie?

Grazie in anticipo.

risposta

3

ho cercato 'ar p', ma parlando con un amico si è deciso la seguente soluzione pitone potrebbe essere migliore. Ora è possibile estrarre i file oggetto ripetuti.

def extract_archive(pathtoarchive, destfolder) : 

    archive = open(pathtoarchive, 'rb') 

    global_header = archive.read(8) 
    if global_header != '!<arch>\n' : 
     print "Oops!, " + pathtoarchive + " seems not to be an archive file!" 
     exit() 

    if destfolder[-1] != '/' : 
     destfolder = destfolder + '/' 

    print 'Trying to extract object files from ' + pathtoarchive 

    # We don't need the first and second chunk 
    # they're just symbol and name tables 

    content_descriptor = archive.readline() 
    chunk_size = int(content_descriptor[48:57]) 
    archive.read(chunk_size) 

    content_descriptor = archive.readline() 
    chunk_size = int(content_descriptor[48:57]) 
    archive.read(chunk_size) 

    unique_key = 0; 

    while True : 

     content_descriptor = archive.readline() 

     if len(content_descriptor) < 60 : 
      break 

     chunk_size = int(content_descriptor[48:57]) 

     output_obj = open(destfolder + pathtoarchive.split('/')[-1] + '.' + str(unique_key) + '.o', 'wb') 
     output_obj.write(archive.read(chunk_size)) 

     if chunk_size%2 == 1 : 
      archive.read(1) 

     output_obj.close() 

     unique_key = unique_key + 1 

    archive.close() 

    print 'Object files extracted to ' + destfolder + '.' 
+1

Ottimo, ho avuto lo stesso problema e questo script ha risolto il problema. Ma credo che dovresti scrivere '' 'content_descripter [48:58]' '' invece di 48:57. Il campo delle dimensioni del file è 10 byte invece di 9 byte in base a [Wikipedia] (https://en.wikipedia.org/wiki/Ar_ (Unix)). –

+1

Inoltre, se si gestisce la variante BSD del formato di file .a (ad esempio, su Mac), il nome del file può essere una parte della parte del corpo, come spiegato in [Wikipedia] (https://en.wikipedia.org/wiki/aR_ (Unix)). Quindi avresti anche bisogno di una logica per eliminarlo. –

0

È possibile rinominare gli oggetti: il loro nome non significa nulla durante il collegamento. Questo dovrebbe funzionare:

mkdir merge-objs && 
cd merge-objs && 
ar x ../a.a && 
for j in *.o; do mv $j a-$j; done && 
ar x ../b.a && 
ar r ../merged.a *.o && 
cd .. && rm -rf merge-objs 
+2

Il problema non è che' re ripetuto tra gli archivi, ma gli oggetti sono ripetuti all'interno della stessa libreria, all'interno dello stesso archivio! Quando 'ar' li estrae, oggetti, dallo stesso archivio, con lo stesso nome vengono sovrascritti.Ma grazie per il tuo aiuto :) –

1
  1. è necessario estrarre gli oggetti dalla libreria statica (la biblioteca che contiene gli oggetti duplicati)
  2. Allora è necessario costruire una nuova biblioteca dagli oggetti estratti.
  3. La nuova libreria conterrà SOLO UNA istanza degli oggetti duplicati.
  4. È necessario utilizzare il comando ar t per produrre gli elenchi degli oggetti dalle due librerie (l'originale, con i duplicati uno e il nuovo, senza duplicati).
  5. Quindi utilizzare vimdiff per controllare le differenze tra i due elenchi.
  6. Annota tutte le differenze.
  7. quindi estrarre solo gli oggetti (punto 6) oggetti dalla libreria originale, utilizzando il comando ar x my_original_lib.a object.o
  8. Quindi rinominare l'oggetto estratto prodotta a qualsiasi nome che ti piace
  9. quindi utilizzare il comando ar m my_original_lib.a object.o per riorganizzare l'object.o
  10. Quindi utilizzare lo stesso comando, come il punto 7, e si estrarre il secondo object.o
  11. Dare un nome diverso per l'oggetto appena estratto
  12. Usa entrambi per costruire la nuova libreria.
  13. Il metodo contiene per QUALSIASI numero di oggetti duplicati nella libreria statica. Basta usare il passo 9 e 7 volte per estrarre tutti i dublicates
+0

Un codice C++ che unisce molte librerie in una singola nuova, senza sovrascrivere possibili oggetti duplicati è qui: http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/ – paulsepolia

Problemi correlati