3 votes

LSB AppChecker : Liens GCC contre les bibliothèques inutilisées

Je vérifie la portabilité d'un objet partagé (.so) avec le LSB AppChecker.
L'un des problèmes qu'il signale est qu'il existe une bibliothèque externe (libm.so.6) qui n'est pas utilisée mais qui est tout de même liée.

Comment puis-je empêcher GCC d'établir un lien avec cette bibliothèque inutile ?

EDITAR:
La sortie de la commande ldd pour mon objet partagé est la suivante :

    linux-gate.so.1 =>  (0x009ff000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x003dc000)
    libm.so.6 => /lib/libm.so.6 (0x00110000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00137000)
    libc.so.6 => /lib/libc.so.6 (0x0021d000)
    /lib/ld-linux.so.2 (0x0097f000)

4voto

bdonlan Points 90068

Passez l'argument -Wl,-as-need dans la ligne de commande de l'éditeur de liens. Cela supprimera automatiquement toutes les dépendances directes de la bibliothèque dont vous n'utilisez pas les symboles.

$ g++ -o test test.cpp -lm; readelf -d test|grep '(NEEDED)'
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
$ g++ -o test test.cpp -lm -Wl,-as-needed; readelf -d test|grep '(NEEDED)'                                                                    
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

-1voto

Bklyn Points 1738

À moins que vous ne spécifiiez -lm dans votre propre commande de liaison, une autre bibliothèque que vous utilisez dépend probablement de la bibliothèque mathématique. A en juger par le fait que cette question est étiquetée c++, vous l'obtenez probablement comme un effet secondaire de l'édition de liens avec libstdc++ et il n'y a pas grand chose que vous puissiez faire.

% ldd /usr/lib/libstdc++.so.6                                                                                      
        linux-gate.so.1 =>  (0x4001e000)
        libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x40127000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x4014d000)
        /lib/ld-linux.so.2 (0x40000000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x402b1000)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X