Question

La façon dont le projet de mon équipe se développe, nous générons une bibliothèque d'objets partagés pour notre application de tous tous nos fichiers d'objets .o. Ma tâche (nous espérons qu'il est assez précis, mais aussi assez général pour être utile à d'autres!) Est de lier seulement dans les fichiers objets qui ont changé depuis la dernière fois que l'exécutable a été créé. Par exemple, voici la ligne de commande que j'utilise pour construire le .donc:

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

Ce qui fonctionne comme prévu! :) Mon objectif est d'être en mesure de relier uniquement dans les fichiers objets modifiés à partir de maintenant, pour accélérer le processus de liaison simultanée. Un exemple de commande serait:

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

Ce qui mettrait à jour libMySharedLibrary.so avec les nouveaux fichiers d'objets, tout en maintenant les fichiers d'objets anciens dans libMySharedLibrary.so aussi. En réalité, quand je produis libMySharedLibrary.so en utilisant la commande ci-dessus, le fichier de taille est beaucoup plus petite que celle du moment où tous les fichiers d'objets sont inclus, donc je peux presque être sûr que la commande ci-dessus ne fait pas ce que je veux.

Grâce à mes recherches, j'ai trouvé qu'il ya une option pour -i l'éditeur de liens qui est le même que l'option -r, qui semble simplement combiner tous les fichiers objets dans un grand fichier objet aussi bien. Malheureusement, il ne semble pas que ce que je veux.

En bref, je voudrais lien que dans les fichiers objets modifiés après le lien initial, ce qui entraîne dans le processus liant plus rapide pour les liens futurs. Y a-t-il un moyen de faire cela?

EDIT: Un exemple de ce que j'ai essayé avec -i/-r:

commande Exemple: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

Je devais ajouter le tag -nostdlib pour l'empêcher de crier à moi de besoin, et -shared supprimé, car les objets partagés ne sont pas autorisés avec la balise -r.

Cette commande semble claquer tous mes fichiers .o dans un grand fichier .o. Donc, si je pouvais mettre à jour ce fichier .o à partir d'ici avec seulement changé .o, ce serait formidable. Après AllMyObjects.o a d'abord été créé, j'ai essayé cette commande: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o, mais il serait également créer un beaucoup plus petit (taille de fichier-sage) AllMyObjects.o, donc je suppose que cela ne peut pas avoir tous les fichiers objets. Je me sens comme cela est quelque chose que je fais probablement une petite erreur. Quelqu'un at-il des conseils? Merci à l'avance.

Était-ce utile?

La solution

Il semble que vous avez raison sur -shared et -r ne travaillent pas ensemble. J'étais sceptique au sujet de votre ancienne version de GCC, mais même sur Ubuntu 10.10, je peux voir le même:

$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together

Malheureusement, cela signifie que vous avez atteint une impasse si vous avez besoin absolument des objets partagés. Binutils simplement linker n'implémente pas.

Si les bibliothèques statiques sont une option pour vous, ils sont simplement des archives qui peuvent facilement être manipulés avec l'utilitaire ar.

Dans le cas contraire, vous devrez regarder différents linkers ou suites compilateur. Je ne peux pas garantir que vous trouverez cette fonctionnalité, cependant, il semble exotique.

Autres conseils

Vous pouvez trier d'obtenir le comportement que vous êtes après avoir utilisé archives / bibliothèques statiques, mais le lien initial sera toujours prendre la même quantité de temps.

L'utilisation d'un fichier d'archive:

# Initially create the archive
ar r libmylib.a <all object files>

# Create your shared object (re-use this line after libmylib.a is updated)
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so     

# Update the archive file
ar r libmylib.a updated1.o updated2.o

Comme je l'ai dit, il faudra encore la même quantité de temps pour relier réellement le .so comme avant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top