Je dois relier mes programmes C ++ contre quelques bibliothèques partagées qui génèrent trop de puissance sur Y a-t-il un moyen de rediriger leur sortie dans un flux différent ou de le supprimer lorsqu'il est lié à mon code? Je préférerais une manière propre en C ++, mais craignant que cela soit impossible, je serai aussi content des hacks Sale Linker. Aussi un "proxy Je travaille avec une boîte à outils GNU ( STD :: COUT CODE> et
STD :: CERR CODE> Les deux inutiles pour mes utilisations. J'ai accès au code source C ++ de ces bibliothèques, mais je ne peux pas les modifier. P>
libstdc ++ code>" irait bien en dernier recours. P>
g ++ code>,
libtool code>,
ld code>) sous Linux. P>
6 Réponses :
S'ils sont vraiment émettant via Cependant, s'ils utilisent std :: cout code> et
std :: cerr code> alors vous pouvez remplacer les tampons de flux de l'objet, mais vous devriez rediriger votre propre programme sortie à travers d'autres flux. Voir Cette question pour comment faire cela. p>
std :: printf () code> etc. alors cela ne fonctionnera pas. p>
Si vous n'avez pas besoin d'utiliser vous-même vous-même, la chose la plus facile à faire serait de rediriger la sortie standard et une erreur standard de la ligne de commande lorsque vous démarrez votre programme. P>
Si vous DO EM> voulez-vous utiliser vous-même, l'astuce serait de changer le courant d'utilisation qu'ils utilisent. Il y a un certain code et une discussion sur Comment faire ici . C'est vraiment trop long pour poster ici. P> $ myProg> / dev / null 2> & 1 code> p>
Depuis STDOUT (Descripteur de fichier 1) et stardr (descripteur de fichier 2) sont valables pour l'ensemble du processus et que vous ne pouvez pas faire une partie du programme, il est indiqué sur un fichier différent, il n'y a qu'un seul moyen de le faire: Utilisez DUP (2) CODE> pour les dupliquer et utilisez ces descripteurs de fichier dans votre propre code. Fermez les FD 1 et 2,
Ouvrir CODE> / DEV / NULL pour écrire et utiliser
DUP2 code> pour essayer de les définir respectivement sur 1 ou 2 si ce n'est pas déjà. Assez moche, mais ça marcherait. P>
Trois idées (dont aucune n'aime vraiment ...): p>
Vous pouvez modifier le tampon Vous pouvez modifier le tampon de façon permanente et utiliser différents objets COUT / CERR pour votre propre application. P> LI>
Vous pouvez utiliser des fichiers d'en-tête standard modifiés pour la compilation des bibliothèques. Ils pourraient définir de nouveaux objets de flux globaux Comme je l'ai dit, aucune de ces solutions n'est "propre", mais vous l'avez demandé :) ... p> COUT code> /
CERR code> écrivez à l'aide de
rdbuf () code>. Vous pouvez le faire à chaque fois juste avant d'appeler une fonction dans la bibliothèque et que vous le réinitialisez ensuite (peut-être utiliser des fonctions d'emballage). P> LI>
COUT_NEW CODE> et utiliser des macros pour redéfinir
COUT CODE> TO
COUT_NEW CODE>. Vous pouvez simplement dire au compilateur d'utiliser une nouvelle nouvelle version des fichiers d'en-tête uniquement pour la compilation des bibliothèques (vous n'avez donc pas à modifier leur code source). P> LI>
ul>
Eh bien personne ne semble avoir frappé dessus, voici mes suggestions de liaison: p>
écrire () code> et filtrer la sortie sur des descripteurs de fichier 1 code> et 2 code>. Li>.
- liez statiquement votre propre code contre libc, puis interpose la version partagée à StreLCH
écrire () code> comme ci-dessus. li>
- Interpose libc, fournissant un
my_write () code> fonction qui contourne écriture () code> à l'aide de dlsym () code>. Li>.
- wrap
écrire code> lors de la liaison des bibliothèques partagées en passant -WL, - enveloppe = écrire code>. Ensuite, slelch n'importe quelle sortie des descripteurs de fichier 1 code> et 2 code> dans une fonction appelée __ enveloppe_write code>. Les autres descripteurs de fichiers doivent faire appel à __ real_write code>. Li>
ol>
Notez que pour ceux qui ne sont pas au courant, des descripteurs de fichier 1 code> et 2 code> correspondent à stdout code> et stardr code >, qui sont finalement écrits dans le COUT code> / cerr code> machines. Souvent, ceci est implémenté COUT code> appels fwrite code> qui appelle écrire code>, avec des niveaux variés de tampon et de shenanigans aux différents niveaux. P>
Votre meilleur pari est l'option 4, l'inconvénient est que vous devez modifier le lien final pour les bibliothèques partagées. P>
Suivant Best est l'option 2 ci-dessus, l'inconvénient est votre exécutable final est beaucoup plus grosse, mais il n'est pas nécessaire d'utiliser des fonctions idiotes dans votre propre code. P>
Liens h2>
Interposant P>
Si vous mentionnez ld_preload code> ici quelque part?
Ld_preload fait partie de la technique d'interposition
Ce n'est pas vraiment
cerr code> /
cout code>, mais des emballages autour de
stdout_fileno code> et
starr_fileno code>. Il n'y a rien de magique à propos de C ++, sauf qu'il a des utilisateurs.
@Matt: Je viens de mentionner que j'espère que l'on pourrait exploiter que lorsque je relie les codes C ++ (par exemple, des symboles de remplacement). Mais peut-être que cette information linguistique est partie à ce stade.
Imo pas exactement un duplicata, mais connexe: Stackoverflow .Com / Questions / 533038 / ...
@SBI: J'espérais une solution moins intrusive possible, possibles à la phase de liaison.