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.
Où exactement avez-vous arrêté votre binaire lorsque vous avez lancé la commande 'info shared'? –
Après avoir exécuté la commande 'quelques secondes', j'ai émis 'Ctrl-C' interrompre le programme et j'ai émis 'info partagé'. – PokerFace