2017-09-19 2 views
0

Je réalise un débogage cross-compilation. Mon CPU de serveur de construction est amd64. Mon processeur de l'appareil est MIPS. Lorsque j'essaie de déboguer le fichier elf compilé par moi-même. Le gdb ne peut montrer ld.so.1La commande GDB 'info sharedlibrary' ne peut pas afficher toutes les bibliothèques

(gdb) info sharedlibrary 
From  To   Syms Read Shared Object Library 
0x7704f9c0 0x7706c490 Yes (*)  /lib/ld.so.1 
(*): Shared library is missing debugging information. 
(gdb) q 

J'ai vérifié le// proc/xxxx fichier cartes. Il a montré que les bibliothèques partagées sont chargées.

[email protected]:/proc/13679# cat maps 
...... 
76549000-76d48000 rwxp 00000000 00:00 0 [stack:13682]       
76d48000-76d4a000 r-xp 00000000 00:0c 5268 /usr/lib/strongswan/plugins/libstrongswan-addrblock.so      
76d4a000-76d59000 ---p 00002000 00:0c 5268 /usr/lib/strongswan/plugins/libstrongswan-addrblock.so    
...... 

Si je déboguer le fichier qui est installé à partir du serveur de paquets Debian, puis GDB peut afficher toutes les bibliothèques partagées.

(gdb) info sharedlibrary 
From  To   Syms Read Shared Object Library 
0x77341bc0 0x77342c80 Yes (*)  /lib/mips-linux-gnu/libdl.so.2 
0x771d77e0 0x772ff6f0 Yes (*)  /lib/mips-linux-gnu/libc.so.6 
0x773549c0 0x77371490 Yes (*)  /lib/ld.so.1 
(*): Shared library is missing debugging information. 
(gdb) 

Version GDB est: GNU gdb (Debian 7.7.1 + dfsg-5) 7.7.1


Mes questions est la suivante: Pourquoi la commande GDB 'information SharedLibrary' ne peut pas montrer toutes les bibliothèques? Comment puis-je le réparer?


(EDIT)

(Est-ce que chaque fichier exécutable besoin du ld.so de la bibliothèque Il manque?).

La sortie de la commande « mips-linux-gnu-readelf - d src/charon/.libs/charon »

Dynamic section at offset 0x1fc contains 33 entries: 
    Tag  Type       Name/Value 
    0x00000001 (NEEDED)      Shared library: [libstrongswan.so.0] 
    0x00000001 (NEEDED)      Shared library: [libhydra.so.0] 
    0x00000001 (NEEDED)      Shared library: [libcharon.so.0] 
    0x00000001 (NEEDED)      Shared library: [libm.so.6] 
    0x00000001 (NEEDED)      Shared library: [libpthread.so.0] 
    0x00000001 (NEEDED)      Shared library: [libdl.so.2] 
    0x00000001 (NEEDED)      Shared library: [libc.so.6] 
    0x0000001d (RUNPATH)     Library runpath: [/usr/lib/strongswan] 
    0x0000000c (INIT)      0xd00 
    0x0000000d (FINI)      0x2eb0 
    0x00000004 (HASH)      0x32c 
    0x00000005 (STRTAB)      0x904 
    0x00000006 (SYMTAB)      0x4d4 
    0x0000000a (STRSZ)      787 (bytes) 
    0x0000000b (SYMENT)      16 (bytes) 
    0x70000035 (MIPS_RLD_MAP_REL)   0x134dc 
    0x00000015 (DEBUG)      0x0 
    0x00000003 (PLTGOT)      0x13760 
    0x00000011 (REL)      0xcf0 
    0x00000012 (RELSZ)      16 (bytes) 
    0x00000013 (RELENT)      8 (bytes) 
    0x70000001 (MIPS_RLD_VERSION)   1 
    0x70000005 (MIPS_FLAGS)     NOTPOT 
    0x70000006 (MIPS_BASE_ADDRESS)   0x0 
    0x7000000a (MIPS_LOCAL_GOTNO)   18 
    0x70000011 (MIPS_SYMTABNO)    67 
    0x70000012 (MIPS_UNREFEXTNO)   37 
    0x70000013 (MIPS_GOTSYM)    0x11 
    0x6ffffffb (FLAGS_1)     Flags: PIE 
    0x6ffffffe (VERNEED)     0xca0 
    0x6fffffff (VERNEEDNUM)     2 
    0x6ffffff0 (VERSYM)      0xc18 
    0x00000000 (NULL)      0x0 

ED IT

Débogage GDB: La requête gdb 'qXfer: libraries-svr4: read' a renvoyé une liste de bibliothèques vide.

Breakpoint 7, svr4_current_sos_via_xfer_libraries (list=0x7fff8be59ad0, annex=<optimized out>) 
at /gdb/gdb-7.11.1/gdb/solib-svr4.c:1301 
1301 result = svr4_ parse_libraries (svr4_library_document, list); 
1: svr4_library_document = 0x15cd9c0 "<library-list-svr4 version=\"1.0\"/>" 
(gdb) 

Pour les paquets Debian qui ne sont pas compilés par moi, la requête gdb qXfer: bibliothèques SVR4: lire 'returned liste complète bibliothèque partagée.

Comment gdbserver construit la réponse de cette requête 'qXfer: libraries-svr4: read'?


EDIT

Un autre indice:

Les pkgs installés de debian Jessie distribuer est pas le code PIE. Le code que j'ai compilé est le code PIE.

[email protected]:/proc/14956# readelf -r /usr/lib/strongswan/charon 

Relocation section '.rel.dyn' at offset 0xcf0 contains 2 entries: 
Offset  Info Type   Sym.Value Sym. Name 
00000000 00000000 R_MIPS_NONE 
00013870 00000003 R_MIPS_REL32 

[email protected]:/proc/14956# readelf -r /usr/bin/id 

There are no relocations in this file. 
[email protected]:/proc/14956# 

EDIT

Après le débogage gdbserver, je trouve une information étrange. L'entrée DT_DEBUG du processus en cours est 0.Une fois le chargeur relocalisé, le code DT_DEBUG ne doit pas être 0. (?) Le système ne prend-il pas en charge le code PIE? J'utilise le système Debian Jessie MIPS.

gdbserver code source:

if (dyn->d_tag == DT_DEBUG && map == -1) 
    map = dyn->d_un.d_val; 

gdbserver dbg print

(gdb) p *dyn 
$19 = {d_tag = 21, d_un = {d_val = 0, d_ptr = 0}} 
(gdb) 

EDIT

obtenir des informations de ce lien: https://sourceware.org/ml/binutils/2015-06/msg00166.html

J'ai installé gdbserver depuis le serveur Debian Jessie mips-pkg. Mais il semble ne pas soutenir PIE. Où puis-je installer le mips-gdbserver qui peut supporter PIE?

Ou comment désactiver le compilateur gcc pour générer le code PIE? J'ai essayé ces drapeaux (-fno-pie -fPIC) dans la compilation croisée, mais il génère toujours le code PIE.

libtool: link: mips-linux-gnu-gcc -mfp32 -fno-pie -fPIC 
     -ggdb -O0 -Wall -Wno-format -Wno-format-security 
     -Wno-pointer-sign -I/cross-mips/usr/include -I/cross-mips/usr/include/libnl3 
     -I/cross-mips/usr/include/mips-linux-gnu 
     -I/work/strongswan/src/util 
     -include /work/strongswan/config.h 
     -o .libs/charon charon.o -L/cross-mips/lib/mips-linux-gnu 
     - L/cross-mips -L/cross-mips/usr/lib/mips-linux-gnu 
     ../../src/libstrongswan/.libs/libstrongswan.so 
     -lm -lpthread -ldl -Wl,-rpath -Wl,/usr/lib/strongswan 

Vérifiez le code généré:

mips-linux-gnu-readelf -r src/charon/.libs/charon 

Relocation section '.rel.dyn' at offset 0xcf0 contains 2 entries: 
Offset  Info Type   Sym.Value Sym. Name 
00000000 00000000 R_MIPS_NONE 
00013870 00000003 R_MIPS_REL32 

Solution Malheureusement, la raison est mon gcc-6 compilateur est Brocken. J'ai utilisé 'gcc version 6.3.0 20170516 (Debian 6.3.0-18)'. Il est configuré avec '--enable-default-pie'. Et il n'y a aucun moyen de désactiver TARTE. Et cette TARTE brise les liens de bibliothèque statiques. Je dois changer mon compilateur en gcc5.

+0

Où exactement avez-vous arrêté votre binaire lorsque vous avez lancé la commande 'info shared'? –

+0

Après avoir exécuté la commande 'quelques secondes', j'ai émis 'Ctrl-C' interrompre le programme et j'ai émis 'info partagé'. – PokerFace

Répondre

1

De l'information que vous avez fourni, il semble qu'il y ait deux causes probables:

  1. Soit vous dépouillez entièrement votre binaire et gdbserver nécessite un symbole, ou

  2. Vous construisez une PIE binaire, et gdbserver sur votre système ne supporte pas ces binaires.

(Il est également possible que c'est la combinaison de 1 et 2 qui cause le problème.)

Puisque vous savez que les binaires de distribution fonctionnent, votre meilleur pari est probablement de comprendre les différences entre eux et votre binaire, et en minimisant ces différences jusqu'à ce que gdbserver commence à travailler.