Si c'est une bibliothèque partagée
Vous êtes arrosé, malheureusement, il n'est pas possible de savoir où l'
les bibliothèques ont été placés dans la mémoire par l'éditeur de liens dynamique après le fait.
Eh bien, il est encore possible de récupérer les informations, pas de la binaire, mais à partir de l'objet. Mais vous avez besoin de l'adresse de base de l'objet. Et cette information est encore dans le processus, dans le link_map structure.
Alors d'abord vous souhaitez importer la structure link_map dans GDB. Donc permet de compiler un programme avec des symboles de débogage et l'ajouter à la GDB.
lien.c
#include <link.h>
toto(){struct link_map * s = 0x400;}
get_baseaddr_from_coredump.sh
#!/bin/bash
BINARY=$(which myapplication)
IsBinPIE ()
{
readelf -h $1|grep 'Type' |grep "EXEC">/dev/null || return 0
return 1
}
Hex2Decimal ()
{
export number="`echo "$1" | sed -e 's:^0[xX]::' | tr '[a-f]' '[A-F]'`"
export number=`echo "ibase=16; $number" | bc`
}
GetBinaryLength ()
{
if [ $# != 1 ]; then
echo "Error, no argument provided"
fi
IsBinPIE $1 || (echo "ET_EXEC file, need a base_address"; exit 0)
export totalsize=0
# Get PT_LOAD's size segment out of Program Header Table (ELF format)
export sizes="$(readelf -l $1 |grep LOAD |awk '{print $6}'|tr '\n' ' ')"
for size in $sizes
do Hex2Decimal "$size"; export totalsize=$(expr $number + $totalsize); export totalsize=$(expr $number + $totalsize)
done
return $totalsize
}
if [ $# = 1 ]; then
echo "Using binary $1"
IsBinPIE $1 && (echo "NOT ET_EXEC, need a base_address..."; exit 0)
BINARY=$1
fi
gcc -g3 -fPIC -shared link.c -o link.so
GOTADDR=$(readelf -S $BINARY|grep -E '\.got.plt[ \t]'|awk '{print $4}')
echo "First do the following command :"
echo file $BINARY
echo add-symbol-file ./link.so 0x0
read
echo "Now copy/paste the following into your gdb session with attached coredump"
cat <<EOF
set \$linkmapaddr = *(0x$GOTADDR + 4)
set \$mylinkmap = (struct link_map *) \$linkmapaddr
while (\$mylinkmap != 0)
if (\$mylinkmap->l_addr)
printf "add-symbol-file .%s %#.08x\n", \$mylinkmap->l_name, \$mylinkmap->l_addr
end
set \$mylinkmap = \$mylinkmap->l_next
end
il permet d'imprimer l'ensemble du link_map contenu, à l'intérieur d'un ensemble de commande GDB.
Il lui seul, il peut semble unnesseray mais avec le base_addr de l'objet partagé, nous sommes sur le point, vous risquez d'obtenir des informations un peu plus d'une adresse par debuging directement impliquées objet partagé dans un autre GDB instance.
Garder la première gdb pour avoir une idee du symbole.
REMARQUE : le script est plutôt incomplète je soupçonne que vous pouvez ajouter à la deuxième paramètre de ajouter-symbole-fichier imprimé la somme avec cette valeur :
readelf -S $SO_PATH|grep -E '\.text[ \t]'|awk '{print $5}'
où $SO_PATH est le premier argument de l'add-symbole-fichier
J'espère que ça aide