2013-08-07 7 views
3

Supposons que j'ai une bibliothèque - foo.so. Lors de la construction de mon binaire (qui a besoin de cette bibliothèque), je peux soit (1) lier foo.so, soit (2) dans le code source du programme, dlopen cette bibliothèque puis appeler les fonctions fournies par cette bibliothèquedlopen vs liaison overhead

une différence de performance entre (1) et (2) lorsque j'appelle une fonction de la bibliothèque? Notez que je suis conscient qu'il y aura différentes caractéristiques d'initialisation (comme le coût du dlopen, les frais généraux pour la première utilisation d'un symbole, etc.) mais en régime permanent, les deux alternatives sont-elles aussi rapides ou plus rapides?

Merci.

Répondre

2

Si la bibliothèque est un objet partagé (par exemple certains fichiers lib*.so) compilé avec gcc -Wall -fPIC -O2 et lié à gcc -shared il est une bibliothèque partagée ELFPosition Independent Code.

PIC est un peu plus coûteux sur 32 bits x 86 -qui a peu registers- que sur 64 bits x86-64 -qui a un certain mode d'adressage facilitant PIC

C'est la même (en régime permanent) performances sage si elle est dlopen -ed ou si elle est liée dynamiquement. Parce que dans les deux cas, la liaison réelle est faite par le dynamic linker (par exemple ld-linux.so) sinus libdl.so est fondamentalement une enveloppe à l'éditeur de liens dynamique. Ce qui compte pour la performance, c'est le code à l'intérieur du lib*.so et il ne change pas si vous le liez ou si vous le liez. Les choses pourraient être légèrement différentes si la bibliothèque est statiquement liée lib*.a. Vous pouvez même compiler et lien la bibliothèque et le programme avec la capacité link time optimization des compilateurs récents du CCG (compiler et lien avecgcc -flto -Wall -O2)

papier Lire Drepper How to Write Shared Library et le livre Program Library HowTo et Levine's Linkers & Loaders.

+0

Mais «dlopen» n'offre-t-il pas une couche d'indirection supplémentaire via un pointeur? –

+0

Non w.r.t. une bibliothèque partagée (comme 'libc.so') qui utilise aussi une indirection –