2012-02-08 6 views
5

Estoy intentando crear una gran biblioteca estática que combine dos bibliotecas estáticas. En este momento estoy usando el comando 'AR', la extracción de objetos, por ejemplo, de 'AA' y 'ba' y luego volver a montar estos objetos usando 'AR' de nuevo:¿Cómo puedo extraer libs estáticas que contienen archivos de objetos repetidos?

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

Por desgracia, no está funcionando para mi propósito, ya que aa tiene dentro diferentes objetos con el MISMO NOMBRE. El comando 'ar' está extrayendo los objetos repetidos y reemplazando los ya extraídos con el mismo nombre. Incluso con el mismo nombre, estos objetos tienen diferentes símbolos, por lo que obtengo referencias no definidas ya que algunos símbolos se pierden junto con los archivos reemplazados.

No tengo acceso a los objetos originales y ya probé 'ar xP' y 'ar xv' y un montón de 'ar stuff'. ¿Alguien puede ayudarme a mostrar cómo fusionar estas libs?

Gracias de antemano.

Respuesta

3

Probé 'ar p', pero hablando con un amigo se decidió que la siguiente solución de python podría ser mejor. Ahora es posible extraer los archivos de objetos repetidos.

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

Genial, tuve el mismo problema y este script resolvió el problema. Pero creo que deberías escribir '' 'content_descripter [48:58]' '' en lugar de 48:57. El campo de tamaño de archivo es de 10 bytes en lugar de 9 bytes según [Wikipedia] (https://en.wikipedia.org/wiki/Ar_ (Unix)). –

+1

Además, si maneja la variante BSD del formato de archivo .a (por ejemplo, en Mac), el nombre del archivo puede ser una parte de la parte del cuerpo, como se explica en [Wikipedia] (https://en.wikipedia.org/wiki/Ar_ (Unix)). Entonces también necesitarías una lógica para despojarlo. –

0

Puede cambiar el nombre de los objetos; su nombre no significa nada durante la vinculación. Esto debería funcionar:

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

El problema no es que' re repetido entre archivos, pero los objetos se repiten dentro de la misma lib, dentro del mismo archivo! Cuando 'ar' los extrae, los objetos del mismo archivo con el mismo nombre se sobrescriben.Pero gracias por su ayuda :) –

1
  1. tiene que extraer los objetos de la biblioteca estática (la biblioteca que contiene los objetos duplicados)
  2. Entonces usted tiene que construir una nueva biblioteca de los objetos extraídos.
  3. La nueva biblioteca contendrá SOLAMENTE UNA instancia de los objetos duplicados.
  4. Debe usar el comando ar t para generar las listas de los objetos de las dos bibliotecas (la original, con duplicados y la nueva), sin duplicados.
  5. Luego use, por ejemplo, vimdiff para verificar las diferencias entre las dos listas.
  6. Anote todas las diferencias.
  7. a continuación, extraer sólo los objetos (paso 6) objetos de la biblioteca original, utilizando el comando ar x my_original_lib.a object.o
  8. cambie el nombre del objeto extraído producido a cualquier nombre que desee
  9. continuación, utilizar el comando ar m my_original_lib.a object.o para reorganizar la object.o
  10. a continuación, utilice el mismo comando, como el paso 7, y que va a extraer la segunda object.o
  11. Dar un nombre diferente al objeto recién extraída
  12. Use ambos para construir la nueva biblioteca.
  13. El método es válido para CUALQUIER cantidad de objetos duplicados en la biblioteca estática. Sólo tiene que utilizar el paso 9 y 7 varias veces para extraer todos los dublicates
+0

Un código de C++ que fusiona muchas bibliotecas en una sola nueva, sin sobreescribir posibles objetos duplicados está aquí: http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/ – paulsepolia

Cuestiones relacionadas