Bonjour,

je veux creer un petit traceur de fonction. J'utilise ptrace et je suis sur Ubuntu x86_64.

Mais j'ai quelque probleme avec le Global Offset Table. J'ai le code suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      size_t baseAddress = this->getBaseAddress();
        Elf_Ehdr const * headerElf = static_cast<Elf_Ehdr const *> (this->_manager.readMemory((void*) baseAddress, sizeof (Elf_Ehdr)));
     Elf_Phdr const * headerProgram = static_cast<Elf_Phdr const *> (this->_manager.readMemory((void*) (baseAddress + headerElf->e_phoff), headerElf->e_phentsize * headerElf->e_phnum));
     unsigned int i = 0;
     while (headerProgram[i].p_type != PT_DYNAMIC)
     {
         ++i;
     }
     size_t addrToRead = headerProgram[i].p_vaddr;
     Elf_Dyn const * dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn)));
     while (dynSection->d_tag != DT_PLTGOT)
     {
         addrToRead += sizeof (Elf_Dyn);
         dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn)));
     }
 
     size_t addrGot = dynSection->d_un.d_ptr/* + (4 * sizeof (Elf64_Word))*/;
     std::cout << "addr got = " << std::hex << "0x" << dynSection->d_un.d_ptr << " 0x" << addrGot << std::endl;
 
     Elf64_Word const * temp = (Elf64_Word const *) this->_manager.readMemory((void*) addrGot, sizeof (Elf64_Word));
 struct link_map * linkList = (struct link_map *) this->_manager.readMemory((void*) *temp, sizeof (struct link_map));
La fonction readMemory lie dans la memoire du processus trace.
Quand j'essaie de lire linklist->l_ld , ca ne semble pas pointer sur une dynamic section.

Je ne suis pas tout a fait sur que mon code soit correct. Du moins quand j'utilise readelf, l'addresse du got est la meme que celle que j obtiens avec mon programme.

Est-ce que je dois lire seulement la premiere entree du GOT ou bien plus? Dois je lire a partir d'un offset precis? Les entrees du GOT contiennent bien des adresses absolus qui pointe vers la struct link_map?

merci