Как извлечь статические библиотеки, содержащие повторяющиеся объектные файлы? - PullRequest
7 голосов
/ 08 февраля 2012

Я пытаюсь создать большую статическую библиотеку, объединяющую две статические библиотеки. Сейчас я использую команду «ar», извлекаю объекты, например, из «a.a» и «b.a», а затем снова собираю эти объекты, используя «ar»:

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

К сожалению, это не работает для моей цели, так как a.a имеет внутри разные объекты с одинаковым именем. Команда 'ar' извлекает повторяющиеся объекты и заменяет уже извлеченные объекты с тем же именем. Даже при одном и том же имени эти объекты имеют разные символы, поэтому я получаю неопределенные ссылки, поскольку некоторые символы пропускаются вместе с заменяемыми файлами.

У меня нет доступа к исходным объектам, и я уже пробовал 'ar xP' и 'ar xv', а также множество 'ar stuff'. Кто-нибудь может помочь мне показать, как объединить эти библиотеки?

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 09 февраля 2012

Я попробовал 'ar p', но поговорив с другом, было решено, что следующее решение на python могло бы быть лучше. Теперь можно извлечь повторяющиеся объектные файлы.

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 голос
/ 10 ноября 2014
  1. Вы должны извлечь объекты из статической библиотеки (библиотеки, содержащей дублированные объекты)
  2. Затем вы должны построить новую библиотеку из извлеченных объектов.
  3. Новая библиотека будет содержать ТОЛЬКО ОДИН экземпляр дублированных объектов.
  4. Вы должны использовать команду ar t для создания списков объектов из двух библиотек (оригинал - с дубликатами один, а новый - без дубликатов).
  5. Затем используйте, например, vimdiff, чтобы проверить различия между двумя списками.
  6. Запишите все различия.
  7. Затем извлеките только те объекты (шаг 6) из исходной библиотеки, используя команду ar x my_original_lib.a object.o
  8. Затем переименуйте полученный извлеченный объект в любое имя, которое вам нравится
  9. Затем используйте команду ar m my_original_lib.a object.o для перестановки объекта.o
  10. Затем используйте ту же команду, что и в шаге 7, и вы извлечете второй объект. O
  11. Дайте другое имя вновь извлеченному объекту
  12. Используйте их обоих для создания новой библиотеки.
  13. Метод работает для ЛЮБОГО числа дублированных объектов в статической библиотеке. Просто используйте шаги 9 и 7, чтобы извлечь все дубликаты
0 голосов
/ 11 января 2015

Код C ++, который объединяет множество библиотек в одну новую, без перезаписи возможных дублированных объектов, находится здесь: http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/

0 голосов
/ 09 февраля 2012

Вы можете переименовывать объекты - их имена ничего не значат при связывании.Это должно работать:

 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
...