Инкрементное связывание с использованием gcc в Linux. Возможно ли это?

Как разрабатывается проект моей команды, мы генерируем библиотеку общих объектов для нашего приложения из всех наших .o объекта Моя задача (надеюсь, она достаточно конкретна, но также достаточно общая, чтобы быть полезной для других!) - связать только те объектные файлы, которые изменились с момента последнего создания исполняемого файла. Например, вот командная строка, которую я использую для создания .so:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o   -o libMySharedLibrary.so

Что работает, как ожидалось! :) Моя цель - теперь иметь возможность связывать только измененные объектные файлы, чтобы ускорить параллельный процесс связывания. Примером команды может быть:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o   -o libMySharedLibrary.so

Которая обновит libMySharedLibrary.so новыми объектными файлами, сохранив старые объектные файлы в libMySharedLibrary.so также. На самом деле, когда я генерирую libMySharedLibrary.so с помощью указанной выше команды, размер файла намного меньше, чем при включении всех объектных файлов, поэтому я почти уверен, что указанная выше команда не делаю то, что хочу.

В ходе своего исследования я обнаружил, что для компоновщика есть параметр -i , который аналогичен параметру -r , который, кажется, просто объединяет все объектные файлы в один большой объектный файл. К сожалению, не похоже, что это то, что я хочу.

Короче говоря, я хотел бы связать только измененные объектные файлы после начальной ссылки, что приведет к более быстрому процессу создания ссылок для будущих ссылок. Есть ли способ сделать это?

EDIT: пример того, что я пробовал с -i / -r :

Пример команды: g ++ 34 -Wl, -r -nostdlib -rdynamic -m64 -Wl, -rpath, '$ ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

Мне пришлось добавить тег -nostdlib , чтобы он не кричал на я о том, что он нужен, и удалил -shared , потому что общие объекты не разрешены с тегом -r .

Похоже, эта команда уничтожает все мои файлы. o файлы в один большой файл .o. Так что, если бы я мог просто обновить этот файл .o, используя только измененные файлы .o, это было бы здорово. После того, как AllMyObjects.o был первоначально создан, я попробовал эту команду: g ++ 34 -Wl, -r -nostdlib -rdynamic -m64 -Wl, -rpath, '$ ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects .o , но при этом будет создан гораздо меньший (по размеру файла) AllMyObjects.o , поэтому я предполагаю, что он не может иметь все объектные файлы. Я чувствую, что это то, в чем я, вероятно, допускаю небольшую ошибку. У кого-нибудь есть совет? Заранее спасибо.

17
задан Raphael Raven 22 November 2010 в 20:04
поделиться