Giter Club home page Giter Club logo

ft_nm's Introduction

wakatime

Sources

Note for debuging

scan-build-12 make re
scan-view-12 /tmp/....

Elf header

L'en-tĂȘte ELF commence par un magic. Ce magic de l'en-tĂȘte ELF fournit des informations sur le fichier. Les 4 premiĂšres parties hexadĂ©cimales dĂ©finissent qu'il s'agit d'un fichier ELF (45=E,4c=L,46=F), prĂ©fixĂ© par la valeur 7f.

Class

32 bits ou 64 bits

Data

Il comporte deux options: 01 pour le LSB (Least Significant Bit), Ă©galement connu sous le nom de little-endian. Ensuite, il y a la valeur 02, pour MSB (Most Significant Bit, big-endian).

OS/ABI

Les fonctions communes de chaque systĂšme d'exploitation se chevauchent largement.

En outre, chacun d'eux possÚde des fonctions spécifiques, ou du moins des différences mineures entre eux. La définition du bon ensemble se fait avec une Interface Binaire d'Application.

Type

Le champ "type" nous indique l'objectif du fichier. Il existe quelques types de fichiers courants.

  • CORE (value 4)
  • DYN (Shared object file), for libraries (value 3)
  • EXEC (Executable file), for binaries (value 2)
  • REL (Relocatable file), before linked into an executable file (value 1)

File data

Outre l'en-tĂȘte ELF, les fichiers ELF se composent de trois parties.

  1. Program Headers or Segments (9)
  2. Section Headers or Sections (28)
  3. Data

Program headers

Un fichier ELF se compose de zéro ou plusieurs segments, et décrit comment créer une image de processus/mémoire pour l'exécution.

Lorsque le noyau voit ces segments, il les utilise pour les mapper dans l'espace d'adressage virtuel, en utilisant l'appel systÚme mmap(2). En d'autres termes, il convertit des instructions prédéfinies en une image mémoire.

Si votre fichier ELF est un binaire normal, il a besoin de ces en-tĂȘtes de programme. Sinon, il ne s'exĂ©cutera tout simplement pas. Il utilise ces en-tĂȘtes, avec la structure de donnĂ©es sous-jacente, pour former un processus.

Ce processus est similaire pour les bibliothÚques partagées.

ELF sections

Section headers

Les en-tĂȘtes de section dĂ©finissent toutes les sections du fichier. Comme nous l'avons dit, cette "vue" est utilisĂ©e pour la liaison et la relocalisation.

Pour les fichiers exĂ©cutables, il y a quatre sections principales : .text, .data, .rodata, et .bss. Chacune de ces sections est chargĂ©e avec des droits d'accĂšs diffĂ©rents, qui peuvent ĂȘtre vus avec readelf -S.

  • .text: Contient du code exĂ©cutable.
  • .data: DonnĂ©es initialisĂ©es, avec droits d'accĂšs en lecture/Ă©criture
  • .rodata: DonnĂ©es initialisĂ©es, avec des droits d'accĂšs en lecture uniquement (=A).
  • .bss: DonnĂ©es non initialisĂ©es, avec droits d'accĂšs en lecture/Ă©criture (=WA)

Section groups

Certaines sections peuvent ĂȘtre regroupĂ©es, car elles forment un tout, ou en d'autres termes ĂȘtre une dĂ©pendance.

Les linkers les plus récents supportent cette fonctionnalité. Pourtant, il n'est pas courant de trouver cela si souvent.

Binaires statiques et dynamiques

Lorsqu'il s'agit de binaires ELF, il est bon de savoir qu'il existe deux types et comment ils sont liés. Le type est soit statique soit dynamique et fait référence aux bibliothÚques utilisées.

À des fins d'optimisation, nous voyons souvent que les binaires sont "dynamiques", ce qui signifie qu'ils ont besoin de composants externes pour fonctionner correctement.

Souvent, ces composants externes sont des bibliothÚques normales, qui contiennent des fonctions courantes, comme l'ouverture de fichiers ou la création d'un socket réseau.

Les binaires statiques, par contre, ont toutes les bibliothĂšques incluses.

Symbols

  • A (absolute) : indicates that the symbol has an absolute value that is not bound to any section.
  • B (uninitialized data) : indicates that the symbol is defined in a section that contains uninitialized data.
  • C (common) : indicates that the symbol is uninitialized data that is not bound to any section.
  • D (initialized data) : indicates that the symbol is defined in a section that contains initialized data.
  • N (debug) : debugger symbol.
  • R (read only data) : indicates that the symbol is defined in a section that contains read-only data.
  • T (code) : indicates that the symbol is defined in a section that contains code.
  • U (undefined) : indicates that the symbol is not defined in the file.
  • V (weak) : indicates that the symbol is a weak symbol.
  • W (warning) : indicates that the symbol is a warning symbol.

Elf.h

Small representation of elf header

ELF Header
    |
    |- File information (Elf64_Ehdr)
        |- e_ident (Identification bytes)
        |- e_type (Type of file)
        |- e_machine (Architecture)
        |- e_version (ELF version)
        |- e_entry (Entry point virtual address)
        |- e_phoff (Program header table file offset)
        |- e_shoff (Section header table file offset)
        |- e_flags (Processor-specific flags)
        |- e_ehsize (ELF header size in bytes)
        |- e_phentsize (Program header table entry size)
        |- e_phnum (Program header table entry count)
        |- e_shentsize (Section header table entry size)
        |- e_shnum (Section header table entry count)
        |- e_shstrndx (Section header string table index)
    |
    |- Program header table (Elf64_Phdr)
        |- p_type (Type of segment)
        |- p_flags (Segment flags)
        |- p_offset (File offset of segment)
        |- p_vaddr (Virtual address of segment)
        |- p_paddr (Physical address of segment)
        |- p_filesz (Size of segment in file)
        |- p_memsz (Size of segment in memory)
        |- p_align (Alignment of segment)
    |
    |- Section header table (Elf64_Shdr)
        |- sh_name (Section name)
        |- sh_type (Type of section)
        |- sh_flags (Section flags)
        |- sh_addr (Section virtual address)
        |- sh_offset (Section file offset)
        |- sh_size (Section size)
        |- sh_link (Link to other section)
        |- sh_info (Extra information)
        |- sh_addralign (Section alignment)
        |- sh_entsize (Entry size if section holds a table)
    |
    |- Symbol table (Elf64_Sym)
        |- st_name (Symbol name)
        |- st_info (Symbol type and binding)
        |- st_other (Reserved)
        |- st_shndx (Section index of symbol)
        |- st_value (Symbol value)
        |- st_size (Symbol size)
    |
    |- Relocation table (Elf64_Rel and Elf64_Rela)
        |- r_offset (Relocation offset)
        |- r_info (Relocation type and symbol index)
        |- (Elf64_Rela also includes: r_addend (Addend))

e_shnum

Ce champ contient le nombre d'entrĂ©es de la table des entĂȘtes de sections.

Ainsi, la taille en octets de la table des entĂȘtes de sections pourra ĂȘtre obtenue en multipliant e_shentsize par e_shnum.

S'il n'y a pas de table des entĂȘtes de sections, le champ e_shnum contiendra zĂ©ro.

e_shoff

Ce champ contient le dĂ©calage en octets de la table des entĂȘtes de sections. Si ce fichier ne contient pas de table des entĂȘtes des sections, ce champ contient zĂ©ro.

Ar file

Le contenu d'un fichier de table de symboles d'archive est le suivant, oĂč la taille des mots est de 4 octets pour une table de symboles de 32 bits et de 8 bytes pour une table de symboles de 64 bits.

  1. Le nombre de symboles. Longueur: wordsize bytes.
  2. Le tableau des décalages dans le fichier archive. Longueur: wordsize bytes * «le nombre de symboles».
  3. La table de chaßne de symboles. Longueur: ar_size - wordsize bytes * («le nombre de symboles» + 1).

La table de symboles 32 bits suivante, par exemple, définit 4 symboles. L'archive membre à l'offset de fichier 114 définit le name.

L'archive membre à l'offset de fichier 122 définit l'objet.

L'archive membre à l'offset de fichier 426 définit la fonction et l'archive membre à l'offset de fichier 434 définit le name2.

Offset     +0   +1   +2   +3
          ___________________
 0       |         4         | 4 offset entries
         |___________________|
 4       |       114         | name
         |___________________|
 8       |       122         | object
         |___________________|
12       |       426         | function
         |___________________|
16       |       434         | name2
         |___________________|
20       |  n | a  | m  | e  |
         |____|____|____|____|
24       | \0 | o  | b  | j  |
         |____|____|____|____|
28       |  e | c  | t  | \0 |
         |____|____|____|____|
32       |  f | u  | n  | c  |
         |____|____|____|____|
36       |  t | i  | o  | n  |
         |____|____|____|____|
40       | \0 | n  | a  | m  |
         |____|____|____|____|
44       |  e | 2  | \0 |    |
         |____|____|____|____|

La mĂȘme exemple, en utilisant une table de symboles 64 bits serait rendu comme suit. Le membre de l'archive Ă  l'offset de fichier 134 dĂ©finit le name. Le membre de l'archive Ă  l'offset de fichier 142 dĂ©finit l'objet. Le membre de l'archive Ă  l'offset de fichier 446 dĂ©finit la fonction et le membre de l'archive Ă  l'offset de fichier 454 dĂ©finit le name2.

Offset     +0   +1   +2   +3   +4   +5   +6   +7
          _______________________________________
 0       |                  4                    | 4 offset entries
         |_______________________________________|
 8       |                134                    | name
         |_______________________________________|
16       |                142                    | object
         |_______________________________________|
24       |                446                    | function
         |_______________________________________|
32       |                454                    | name2
         |_______________________________________|
40       |  n | a  | m  | e  | \0 | o  | b  | j  |
         |____|____|____|____|___________________|
48       |  e | c  | t  | \0 |  f | u  | n  | c  |
         |____|____|____|____|___________________|
56       |  t | i  | o  | n  | \0 | n  | a  | m  |
         |____|____|____|____|___________________|
64       |  e | 2  | \0 |    |
         |____|____|____|____|

Si le nom d'un membre de l'archive est plus long que 15 octets, un membre spĂ©cial de l'archive contient une table des noms de fichiers, chacun suivi d'une barre oblique et d'un saut de ligne. Ce membre de table de chaĂźnes, s'il est prĂ©sent, prĂ©cĂ©dera tous les membres de l'archive «normaux». La table de symboles spĂ©ciale de l'archive n'est pas un membre «normal» et doit ĂȘtre le premier s'il existe. L'entrĂ©e ar_name de l'en-tĂȘte du membre de la table de chaĂźnes contient un nom de longueur zĂ©ro ar_name [0] == '/', suivi d'une barre oblique finale (ar_name [1] == '/'), suivie d'espaces (ar_name [2] == ' ', etc.). Les dĂ©calages dans la table de chaĂźnes commencent Ă  zĂ©ro. Des exemples de valeurs ar_name pour des noms de fichiers courts et longs apparaissent ci-dessous.

Offset   +0   +1   +2   +3   +4   +5   +6   +7   +8   +9
       __________________________________________________
 0     | f  | i  | l  | e  | _  | n  | a  | m  | e  | _  |
       |____|____|____|____|____|____|____|____|____|____|
10     | s  | a  | m  | p  | l  | e  | /  | \n | l  | o  |
       |____|____|____|____|____|____|____|____|____|____|
20     | n  | g  | e  | r  | f  | i  | l  | e  | n  | a  |
       |____|____|____|____|____|____|____|____|____|____|
30     | m  | e  | x  | a  | m  | p  | l  | e  | /  | \n |
       |____|____|____|____|____|____|____|____|____|____|
   Member Name                            ar_name
_______________________________________________________________
short-name           | short-name/  | Not in string table
                     |              |
file_name_sample     | /0           | Offset 0 in string table
                     |              |
longerfilenamexample | /18          | Offset 18 in string table
_____________________|______________|___________________________

ft_nm's People

Contributors

owalid avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.