[Kos-dev] EXPORT_FUNCTION_RESTRICTED

Thomas Petazzoni thomas.petazzoni at enix.org
Wed Dec 15 23:41:59 CET 2004


Bonjour,

Je viens de committer un patch qui ajoute la macro 
EXPORT_FUNCTION_RESTRICTED en plus de la macro EXPORT_FUNCTIOn déjà 
existante pour exporter un symbole.

Ce que ça fait
--------------

Le soucis que j'ai vu avec EXPORT_FUNCTION, c'est qu'on a une vision 
très binaire de l'export de symbole. Soit le symbole est exporté auquel 
cas il est visible de tout le monde et de partout, soit il n'est pas 
exporté, auquel cas il n'est visible de nulle part (sauf du module 
courant évidemment).

Il me semble qu'il y a pas mal de symboles qui sont destinées à être 
utilisés exclusivement par certains modules. Il m'a paru donc 
intéressant d'écrire une macro du type EXPORT_FUNCTION_RESTRICTED qui 
s'utilise de la manière suivante :

EXPORT_FUNCTION_RESTRICTED(symbol, module);

qui va tout naturellement autoriser le "module" à accéder au symbole 
"symbol", mais pas les autres modules.

A priori, rien n'empêche d'exporter un symbole vers plusieurs modules en 
utilisant plusieurs directives EXPORT_FUNCTION_RESTRICTED.

Comment ça marche
-----------------

La macro EXPORT_FUNCTION ajoute une entrée dans une section spéciale du 
fichier ELF. Cette entrée contient entre autre la chaîne de caractères 
correspondant au symbole exporté.

EXPORT_FUNCTION_RESTRICTED fonctionne de même, sauf que la chaîne de 
caractères représentant le symbole exporté est sous la forme 
"module:symbolname".

Ensuite, dans loader/elf32/link.c, au lieu de chercher simplement 
"symbolname" dans le dictionnaire des symboles exportés, on cherche 
également "module:symbolname", où "module" est le nom du module courant, 
dont l'extension a été retirée (à priori c'est .ro). Donc si un module a 
exporté le symbole "symbolname" pour notre module, alors on trouvera une 
correspondance, et la relocation sera correctement effectuée. Dans le 
cas contraire, le loader signalera un "Unresolved symbol".

Il est intéressant de noter que grâce au travail de d2 qui a permis la 
réutilisation du code du loader pour mod_check, ce dernier n'a pas eu 
besoin d'être modifié pour supporter cette nouvelle fonctionnalité.

Inconvénient
------------

Le seul problème que je vois pour l'implémentation du patch, c'est les 
manipulations de chaînes de caractères un peu tordues dans 
loader/elf32/link.c. C'est pas bien méchant, mais c'est toujours un peu 
bidouille cette affaire là. J'ai ajouté strrchr() et strcat() pour 
l'occasion.

Bonne soirée,

Thomas
-- 
PETAZZONI Thomas - thomas.petazzoni at enix.org
http://thomas.enix.org - Jabber: thomas.petazzoni at jabber.dk
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E  1624 F653 CB30 98D3 F7A7
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 256 bytes
Desc: OpenPGP digital signature
Url : http://the-doors.enix.org/pipermail/kos-dev/attachments/20041215/a987acbd/signature.pgp


More information about the Kos-dev mailing list