You can have an english version here.

Addrpath, un programme pour ajouter un rpath arbitraire à un binaire ELF

À propos de addrpath

Pour l'instant ce programme fonctionne sur les exécutables normaux et sur les PIE, mais le noyau a un support incorrect des binaires elf (il y a un patch corrigeant le problème). Si on veut essayer sur un noyau non patché, il est possible de compiler le programme pour utiliser un hack contraire à la norme, mais à les programmes peuvent segfaulter (2007-05-27 : Corrigé dirait-on, mais pas pour les PIE. La faute au ld.so?) pour marcher quand même. Addrpath devrait marcher sur tous les ports de linux 32 bits, pour des binaires produits par les GNU binutils. Le portage à une architecture 64 bits est trivialissime, en gros il devrait suffire de faire :
sed 's/32/64/g' addrpath.c > addrpath64.c
Corrigé : Par ailleurs il a pour l'instant comme effet secondaire de stripper les exécutables à un point que nombre d'outils ne reconnaissent plus l'exécutable comme étant en ELF. Par contre, j'insiste sur le fait que les binaires produits sont parfaitement valables du point de vue de la norme (si ce n'est pas le cas, c'est un bug de ma part). Ils sont juste réduits au strict minimum pour pouvoir être chargés en mémoire, tout en respectant la norme.

Les binaires passés à la moulinette voient maintenant leurs sections préservées, mais ne supportent pas d'être strippés, et la libbfd sort des messages incompréhensibles. (donc stripper les binaires avant d'ajouter un rpath) Et probablement il ne faut pas essayer de hacker des bibliothèques partagées, elles deviendraient inutilisables pour de nouvelles compilations. Quelqu'un saurait-il diagnostiquer le problème?

Ah sinon, le programme va probablement segfaulter si le binaire raconte n'importe quoi. Je pourrais rajouter des tests dans tous les sens, mais ça n'aurait pas grand intérêt.

Instructions

C'est quoi?

C'est un petit utilitaire qui permet de rajouter un rpath arbitraire à un binaire ELF.

Où ça?

Vous trouverez le programme et le patch noyau sur ftp://quatramaran.ens.fr/pub/quentin/addrpath (le plus récent est addrpath.c).

Compilation

gcc -std=c99 -Wextra -Wall -O3 -o addrpath addrpath.c
Si vous voulez vraiment tester le programme sur un noyau non patché, rajoutez donc un -DBROKEN_KERNEL, mais ça ne marche pas bien. Vous êtes prévenus.
2007-05-27 Update : Ça devrait mieux marcher maintenant.

(Et oui je sais il y a des tas de warnings sur des variables non initialisées, mais c'est volontaire de les ignorer : les cas où les mauvaises choses se passeraient sont sur des binaires qui racontent n'importe quoi, et je ne suis pas en train d'écrire du code noyau ou d'assister à un TD de C).

Usage

./addrpath file rpath newfile

À faire

Se préoccuper du cas où la table dynamique ne contient pas assez de place pour l'indication de l'emplacement du rpath. (fait)

Cas où pas de segment PT_PHDR. (fait)

Reconnaître un binaire déjà passé à la moulinette.

Bugs

Le programme risque de segfaulter si la table des chaînes est tellement grosse que sa taille dépasse la taille des parties du binaire non chargées en mémoire. (corrigé)

Je fais la supposition que la section contenant la table des chaînes dynamiques s'appelle ".dynstr". (selon la norme j'ai raison mais...)