Man page - elf(5)
Packages contains this manual
- shm_overview(7)
- nss(5)
- proc_mtrr(5)
- intro(7)
- tcp(7)
- iso_8859-9(7)
- armscii-8(7)
- proc_kpagecount(5)
- initrd(4)
- mouse(4)
- proc_stat(5)
- x25(7)
- proc_interrupts(5)
- fifo(7)
- repertoiremap(5)
- icmp(7)
- futex(7)
- feature_test_macros(7)
- lp(4)
- bpf-helpers(7)
- epoll(7)
- proc_sys_dev(5)
- namespaces(7)
- proc_sysrq-trigger(5)
- proc_bus(5)
- cp1251(7)
- proc_pid_maps(5)
- proc_sys_vm(5)
- proc_pid_projid_map(5)
- st(4)
- proc_pid(5)
- issue(5)
- pid_namespaces(7)
- unicode(7)
- inode(7)
- hosts.equiv(5)
- iso-8859-13(7)
- proc_fb(5)
- proc_modules(5)
- proc_pid_autogroup(5)
- keyrings(7)
- sysvipc(7)
- proc_kmsg(5)
- cgroups(7)
- latin6(7)
- proc_pid_uid_map(5)
- unix(7)
- proc_pid_io(5)
- pts(4)
- packet(7)
- ld-linux.so(8)
- tzselect(8)
- iconv(1)
- proc_pid_syscall(5)
- proc_pid_net(5)
- proc_pid_pagemap(5)
- tty(4)
- proc_profile(5)
- standards(7)
- proc_pid_mounts(5)
- filesystems(5)
- iso-8859-15(7)
- locale(5)
- iso_8859_3(7)
- xattr(7)
- iso-8859-2(7)
- proc_uptime(5)
- persistent-keyring(7)
- credentials(7)
- proc_pid_timers(5)
- utmpx(5)
- vcsa(4)
- proc_pid_exe(5)
- proc_net(5)
- proc_timer_stats(5)
- ip(7)
- proc_pid_fd(5)
- ptmx(4)
- user_namespaces(7)
- resolv.conf(5)
- url(7)
- iso_8859_5(7)
- iso_8859-8(7)
- urn(7)
- process-keyring(7)
- proc_pid_auxv(5)
- proc_ksyms(5)
- proc_ide(5)
- veth(4)
- ldd(1)
- proc_swaps(5)
- landlock(7)
- proc_vmstat(5)
- system_data_types(7)
- cp1252(7)
- lirc(4)
- proc_kpageflags(5)
- random(7)
- precedence(7)
- cpuset(7)
- proc_pid_ns(5)
- acct(5)
- latin4(7)
- proc_pid_cgroup(5)
- proc_cpuinfo(5)
- iso_8859-2(7)
- proc_keys(5)
- charsets(7)
- pldd(1)
- proc_pid_stat(5)
- rtnetlink(7)
- netlink(7)
- ram(4)
- mem(4)
- iso-8859-6(7)
- proc_key-users(5)
- iso_8859_15(7)
- fanotify(7)
- proc_sys_net(5)
- sysfs(5)
- math_error(7)
- latin1(7)
- proc_pid_root(5)
- nptl(7)
- proc_cgroups(5)
- proc_iomem(5)
- proc_pid_statm(5)
- sem_overview(7)
- hier(7)
- full(4)
- proc_pid_status(5)
- proc_pid_cwd(5)
- proc_pid_cpuset(5)
- proc_scsi(5)
- uri(7)
- proc_diskstats(5)
- iso_8859_6(7)
- latin2(7)
- latin5(7)
- man-pages(7)
- ld.so(8)
- uts_namespaces(7)
- proc_pid_mountstats(5)
- intro(3)
- proc_pid_seccomp(5)
- proc_pid_wchan(5)
- attributes(7)
- symlink(7)
- mount_namespaces(7)
- charmap(5)
- tis-620(7)
- iso-8859-10(7)
- getent(1)
- proc_buddyinfo(5)
- ttytype(5)
- rtc(4)
- proc_malloc(5)
- suffixes(7)
- sln(8)
- signal(7)
- proc_sys_abi(5)
- signal-safety(7)
- time_namespaces(7)
- proc_pid_comm(5)
- raw(7)
- gai.conf(5)
- proc_crypto(5)
- locale(1)
- iso-8859-3(7)
- motd(5)
- proc_meminfo(5)
- iso-8859-8(7)
- protocols(5)
- proc_pid_map_files(5)
- pthreads(7)
- null(4)
- proc(5)
- zdump(8)
- socket(7)
- proc_sys_kernel(5)
- ddp(7)
- memusagestat(1)
- hd(4)
- iso-8859-14(7)
- shells(5)
- pipe(7)
- glob(7)
- proc_self(5)
- network_namespaces(7)
- utmp(5)
- proc_kcore(5)
- nsswitch.conf(5)
- sd(4)
- iso-8859-5(7)
- iso_8859_16(7)
- man(7)
- iso_8859-6(7)
- dir_colors(5)
- mq_overview(7)
- vsock(7)
- ascii(7)
- thread-keyring(7)
- fs(5)
- proc_pid_attr(5)
- proc_sys_debug(5)
- proc_sys(5)
- proc_pid_cmdline(5)
- pty(7)
- services(5)
- cgroup_namespaces(7)
- securetty(5)
- netdevice(7)
- iso_8859_13(7)
- host.conf(5)
- proc_pid_setgroups(5)
- proc_slabinfo(5)
- sock_diag(7)
- iso_8859-14(7)
- iso-8859-11(7)
- iso_8859_11(7)
- operator(7)
- regex(7)
- wavelan(4)
- proc_sys_fs(5)
- nologin(5)
- proc_pci(5)
- koi8-r(7)
- erofs(5)
- intro(2)
- utf8(7)
- proc_kallsyms(5)
- proc_sysvipc(5)
- queue(7)
- proc_sys_sunrpc(5)
- intro(5)
- latin8(7)
- mtrace(1)
- ipc_namespaces(7)
- dsp56k(4)
- iso_8859_4(7)
- proc_pid_smaps(5)
- proc_cmdline(5)
- rpc(5)
- proc_tty(5)
- proc_version(5)
- smartpqi(4)
- proc_pid_timerslack_ns(5)
- aio(7)
- session-keyring(7)
- resolver(5)
- slabinfo(5)
- wtmp(5)
- iso_8859_9(7)
- proc_locks(5)
- mailaddr(7)
- proc_pid_oom_score(5)
- kmem(4)
- iconvconfig(8)
- iso_8859-7(7)
- glibc(7)
- hostname(7)
- proc_thread-self(5)
- ipv6(7)
- iso_8859_7(7)
- proc_kpagecgroup(5)
- core(5)
- time(7)
- units(7)
- proc_dma(5)
- loop(4)
- address_families(7)
- zero(4)
- intro(4)
- procfs(5)
- iso_8859-4(7)
- vdso(7)
- tmpfs(5)
- iso-8859-16(7)
- iso_8859_10(7)
- user-session-keyring(7)
- libc(7)
- proc_fs(5)
- koi8-u(7)
- latin3(7)
- proc_tid_children(5)
- proc_pid_limits(5)
- proc_pid_coredump_filter(5)
- iso_8859-15(7)
- arp(7)
- urandom(4)
- iso_8859-10(7)
- hpsa(4)
- proc_pid_environ(5)
- boot(7)
- ftm(7)
- ld-linux(8)
- proc_driver(5)
- loop-control(4)
- iso_8859-16(7)
- proc_filesystems(5)
- tzfile(5)
- sprof(1)
- proc_pid_task(5)
- proc_pid_oom_score_adj(5)
- proc_mounts(5)
- iso-8859-4(7)
- iso_8859-1(7)
- utf-8(7)
- iso_8859-13(7)
- intro(6)
- proc_timer_list(5)
- rtld-audit(7)
- iso_8859-3(7)
- group(5)
- sched(7)
- proc_pid_clear_refs(5)
- hosts(5)
- iso_8859-11(7)
- numa(7)
- iso_8859_2(7)
- locale(7)
- iso-8859-1(7)
- fuse(4)
- proc_tid(5)
- proc_execdomains(5)
- proc_pid_mountinfo(5)
- intro(8)
- iso_8859_8(7)
- proc_loadavg(5)
- proc_pid_oom_adj(5)
- re_format(7)
- iso_8859_14(7)
- zic(8)
- bootparam(7)
- inotify(7)
- posixoptions(7)
- proc_partitions(5)
- iso-8859-9(7)
- proc_pid_mem(5)
- networks(5)
- proc_sys_user(5)
- udp(7)
- proc_zoneinfo(5)
- latin10(7)
- proc_pid_fdinfo(5)
- proc_pid_stack(5)
- memusage(1)
- spufs(7)
- pkeys(7)
- path_resolution(7)
- proc_ioports(5)
- intro(1)
- ldconfig(8)
- msr(4)
- svipc(7)
- port(4)
- proc_pid_personality(5)
- cciss(4)
- latin9(7)
- capabilities(7)
- localedef(1)
- vcs(4)
- iso_8859-5(7)
- elf(5)
- proc_sys_proc(5)
- console_codes(4)
- random(4)
- iso-8859-7(7)
- termcap(5)
- cpuid(4)
- environ(7)
- string_copying(7)
- proc_pid_gid_map(5)
- queue(3)
- termio(7)
- user-keyring(7)
- complex(7)
- latin7(7)
- proc_config.gz(5)
- udplite(7)
- kernel_lockdown(7)
- proc_devices(5)
- proc_apm(5)
- iso_8859_1(7)
- proc_pid_numa_maps(5)
apt-get install manpages
Available languages:
en fr ja ruManual
ELF
NOMSYNOPSIS
DESCRIPTION
Types de base
En-tĂȘte ELF (Ehdr)
En-tĂȘte de programme (Phdr)
En-tĂȘte de section (Shdr)
Table des chaĂźnes et des symboles
Entrées de repositionnement (Rel et Rela)
Ătiquettes dynamiques (Dyn)
Notes (Nhdr)
NOTES
VOIR AUSSI
TRADUCTION
NOM
elf â Format des fichiers exĂ©cutables ELF (« Executable and Linking Format »)
SYNOPSIS
#include <elf.h>
DESCRIPTION
Le fichier dâen-tĂȘte <elf.h> dĂ©finit le format des fichiers binaires exĂ©cutables ELF. Ces fichiers peuvent ĂȘtre soit des fichiers exĂ©cutables normaux, des fichiers objets repositionnables, des fichiers core ou des objets partagĂ©s.
Un fichier exĂ©cutable utilisant le format de fichier ELF est constituĂ© dâun en-tĂȘte ELF, suivi dâune table dâen-tĂȘte de programme ou dâune table des en-tĂȘtes de sections, ou des deux. Lâen-tĂȘte ELF est toujours situĂ© Ă un dĂ©placement de zĂ©ro par rapport au dĂ©but du fichier. Les dĂ©placements dans le fichier des tables dâen-tĂȘte de programme et des en-tĂȘtes de sections sont dĂ©finis dans lâen-tĂȘte ELF. Ces deux tables dĂ©crivent le reste des particularitĂ©s du fichier.
Ce fichier dâen-tĂȘte dĂ©crit, sous la forme de structures C, les en-tĂȘtes mentionnĂ©s prĂ©cĂ©demment et inclut Ă©galement des structures pour les sections dynamiques, les sections de repositionnement et les tables de symboles.
Types de base
Les types suivants sont utilisés pour les architectures N-bit (avec N=32,64 ; ElfN signifie Elf32 ou Elf64 ; uintN_t signifie uint32_t ou uint64_t ) :
ElfN_Addr
adresse (non signée) du programme, uintN_t
ElfN_Off déplacement (non signé) dans le
fichier, uintN_t
ElfN_Section indice (non signé) de section, uint16_t
ElfN_Versym informations (non signées) sur les
versions
des symboles, uint16_t
Elf_Byte caractÚre (char) non signé
ElfN_Half uint16_t
ElfN_Sword int32_t
ElfN_Word uint32_t
ElfN_Sxword int64_t
ElfN_Xword uint64_t
(Note : la terminologie *BSD est quelque peu diffĂ©rente. Elf64_Half est deux fois plus grand que Elf32_Half et Elf64Quarter est utilisĂ© pour uint16_t . Afin dâĂ©viter toute confusion, ces types seront remplacĂ©s par des types plus explicites dans la suite de ce document.)
Toutes les structures de donnĂ©es dĂ©finies par le format de fichier suivent la taille « naturelle » et les principes dâalignement de la classe correspondante. Si nĂ©cessaire, les structures de donnĂ©es contiennent un remplissage explicite pour assurer lâalignement sur 4 octets des objets de 4 octets et pour forcer les tailles des structures Ă ĂȘtre des multiples de 4, etc.
En-tĂȘte ELF (Ehdr)
Lâen-tĂȘte ELF est dĂ©crit par le type Elf32_Ehdr ou par le type Elf64_Ehdr :
#define
EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
uint16_t e_type;
uint16_t e_machine;
uint32_t e_version;
ElfN_Addr e_entry;
ElfN_Off e_phoff;
ElfN_Off e_shoff;
uint32_t e_flags;
uint16_t e_ehsize;
uint16_t e_phentsize;
uint16_t e_phnum;
uint16_t e_shentsize;
uint16_t e_shnum;
uint16_t e_shstrndx;
} ElfN_Ehdr;
Les champs ont
les significations suivantes :
e_ident
Ce tableau dâoctets
indique comment interpréter le fichier,
indépendamment du processeur ou du reste du contenu
du fichier. Dans ce tableau, chacun des
Ă©lĂ©ments sâappelle une macro qui
commence par le préfixe
EI_
et peut contenir
des valeurs commençant par le préfixe
ELF
. Les macros suivantes sont définies :
EI_MAG0
Premier octet du nombre magique. Il doit ĂȘtre rempli par ELFMAG0 (0:Â 0x7f).
EI_MAG1
DeuxiĂšme octet du nombre magique. Il doit ĂȘtre rempli par ELFMAG1 (1: « E »).
EI_MAG2
TroisiĂšme octet du nombre magique. Il doit ĂȘtre rempli par ELFMAG2 (2: « L »).
EI_MAG3
QuatriĂšme octet du nombre magique. Il doit ĂȘtre rempli par ELFMAG3 (3: « F »).
EI_CLASS
Le cinquiĂšme octet indique lâarchitecture pour ce binaire :
|
ELFCLASSNONE |
Cette classe nâest pas valable. |
||
|
ELFCLASS32 |
Cela dĂ©finit une architecture 32 bits. Elle permet dâutiliser des machines avec des espaces dâadressage virtuel et des fichiers dâune taille allant jusquâĂ 4 gigaoctets. |
||
|
ELFCLASS64 |
Cela définit une architecture 64 bits. |
EI_DATA
Le sixiÚme octet indique le codage utilisé pour les données de ce fichier spécifiques au processeur. Actuellement, les codages suivants sont gérés :
|
ELFDATANONE |
Format de données inconnu. |
|||
|
ELFDATA2LSB |
Complément à deux, petit boutiste. |
|||
|
ELFDATA2MSB |
Complément à deux, gros boutiste. |
EI_VERSION
Le 7e octet est le numéro de version de la spécification du format ELF :
|
EV_NONE |
Version non valable. |
|||
|
EV_CURRENT |
Version actuelle. |
EI_OSABI
Le 8e octet identifie le systĂšme dâexploitation et lâinterface binaire des applications (ABI) auxquels cet objet est destinĂ©. Certains des champs dâautres structures ELF contiennent des valeurs et des drapeaux dont la signification dĂ©pend de la plate-forme ; lâinterprĂ©tation de ces champs dĂ©pend de la valeur de cet octet. Par exemple :
|
ELFOSABI_NONE |
Identique Ă ELFOSABI_SYSV |
|||
|
ELFOSABI_SYSV |
ABI UNIX System V |
|||
|
ELFOSABI_HPUX |
ABI HP-UX |
|||
|
ELFOSABI_NETBSD |
ABI NetBSD |
|||
|
ELFOSABI_LINUX |
ABI Linux |
|||
|
ELFOSABI_SOLARIS |
ABI Solaris |
|||
|
ELFOSABI_IRIX |
ABI IRIX |
|||
|
ELFOSABI_FREEBSD |
ABI FreeBSD |
|||
|
ELFOSABI_TRU64 |
ABI UNIX TRU64 |
|||
|
ELFOSABI_ARM |
ABI de lâarchitecture ARM |
|||
|
ELFOSABI_STANDALONE |
ABI autonome (embarqué) |
EI_ABIVERSION
Le 9e octet identifie la version de lâinterface binaire des applications (ABI) Ă laquelle cet objet est destinĂ©. Ce champ permet de diffĂ©rencier des versions incompatibles dâune mĂȘme ABI. LâinterprĂ©tation de ce numĂ©ro de version dĂ©pend de lâABI indiquĂ©e par le champ EI_OSABI . Les applications respectant cette spĂ©cification utilisent la valeur 0.
|
EI_PAD |
DĂ©but de remplissage. Ces octets sont rĂ©servĂ©s et positionnĂ©s Ă zĂ©ro. Les programmes qui les lisent ne doivent pas en tenir compte. La valeur de EI_PAD sera modifiĂ©e dans le futur si lâon dĂ©cide de donner une signification Ă des octets actuellement inutilisĂ©s. |
EI_NIDENT
Taille du tableau e_ident .
|
e_type |
Ce membre de la structure identifie le type de fichier objet : |
ET_NONE
|
Type inconnu. |
||||
|
ET_REL |
Fichier repositionnable. |
|||
|
ET_EXEC |
Fichier exécutable. |
|||
|
ET_DYN |
Objet partagé. |
|||
|
ET_CORE |
Fichier core. |
e_machine
Ce membre indique lâarchitecture nĂ©cessaire Ă un fichier particulier. Par exemple :
|
EM_NONE |
Machine inconnue |
|||
|
EM_M32 |
AT&T WE 32100 |
|||
|
EM_SPARC |
Sun Microsystems SPARC |
|||
|
EM_386 |
Intel 80386 |
|||
|
EM_68K |
Motorola 68000 |
|||
|
EM_88K |
Motorola 88000 |
|||
|
EM_860 |
Intel 80860 |
|||
|
EM_MIPS |
MIPS RS3000 (uniquement gros-boutiste) |
|||
|
EM_PARISC |
HP/PA |
|||
|
EM_SPARC32PLUS |
SPARC avec jeu dâinstructions Ă©tendu |
|||
|
EM_PPC |
PowerPC |
|||
|
EM_PPC64 |
PowerPC 64Â bits |
|||
|
EM_S390 |
IBM S/390 |
|||
|
EM_ARM |
Machines modernes de technologie RISC |
|||
|
EM_SH |
Renesas SuperH |
|||
|
EM_SPARCV9 |
SPARC v9 64Â bits |
|||
|
EM_IA_64 |
Intel Itanium |
|||
|
EM_X86_64 |
AMD x86-64 |
|||
|
EM_VAX |
DEC Vax |
e_version
Ce membre indique la version du fichier :
|
EV_NONE |
Version non valable |
|||
|
EV_CURRENT |
Version actuelle |
e_entry
Ce membre indique lâadresse virtuelle Ă laquelle le systĂšme transfĂšre initialement le contrĂŽle, dĂ©marrant ainsi le processus. Si ce fichier ne comporte pas de point dâentrĂ©e, ce champ contient zĂ©ro.
e_phoff
Ce membre contient le dĂ©placement en octets de la table contenant lâen-tĂȘte de programme. Si ce fichier ne comporte pas de table dâen-tĂȘte de programme, ce champ contient zĂ©ro.
e_shoff
Ce membre contient le dĂ©placement en octets de la table des en-tĂȘtes de sections. Si ce fichier ne comporte pas de table des en-tĂȘtes des sections, ce champ contient zĂ©ro.
e_flags
Ce membre contient des drapeaux spĂ©cifiques au processeur associĂ©s au fichier. Le nom de ces drapeaux est de la forme EF_machine_drapeau. Ă lâheure actuelle, aucun drapeau nâa Ă©tĂ© dĂ©fini.
e_ehsize
Ce membre contient la taille de lâen-tĂȘte ELF en octets.
e_phentsize
Ce membre contient la taille en octets dâune entrĂ©e de la table dâen-tĂȘte de programme ; toutes les entrĂ©es sont de mĂȘme taille.
e_phnum
Ce membre contient le nombre dâentrĂ©es de la table dâen-tĂȘte de programme. Ainsi, la taille en octets de la table pourra ĂȘtre obtenue en multipliant e_phentsize par e_phnum . Si un fichier ne comporte pas dâen-tĂȘte de programme, e_phnum contiendra la valeur zĂ©ro.
Si le nombre
dâentrĂ©es de la table dâen-tĂȘte de
programme est supĂ©rieur ou Ă©gal Ă
PN_XNUM
(0xffff), ce membre contient
PN_XNUM
(0xffff) et le nombre rĂ©el dâentrĂ©es
dans la table dâen-tĂȘte de programme est
stocké dans le membre
sh_info
de
lâentrĂ©e initiale de la table des
en-tĂȘtes de sections. Dans le cas contraire, le membre
sh_info
de lâentrĂ©e initiale de la table
des en-tĂȘtes de sections contient la valeur
zéro.
PN_XNUM
Ce nombre est dĂ©fini comme 0xffff, le plus grand nombre que e_phnum peut valoir, qui spĂ©cifie oĂč le nombre rĂ©el dâen-tĂȘtes de programme est assignĂ©.
e_shentsize
Ce membre contient la taille en octets dâun en-tĂȘte de section. Un en-tĂȘte de section est une entrĂ©e de la table des en-tĂȘtes de sections ; toutes les entrĂ©es sont de mĂȘme taille.
e_shnum
Ce membre contient le nombre dâentrĂ©es de la table des en-tĂȘtes de sections. Ainsi, la taille en octets de la table des en-tĂȘtes de sections pourra ĂȘtre obtenue en multipliant e_shentsize par e_shnum . Si un fichier ne comporte pas de table des en-tĂȘtes de sections, le champ e_shnum contiendra zĂ©ro.
Si le nombre dâentrĂ©es de la table des en-tĂȘtes de sections est supĂ©rieur ou Ă©gal Ă SHN_LORESERVE (0xff00), e_shnum contient la valeur zĂ©ro et le nombre rĂ©el dâentrĂ©es dans la table des en-tĂȘtes de sections est stockĂ© dans le membre sh_size de lâentrĂ©e initiale de la table des en-tĂȘtes de sections. Dans le cas contraire, le membre sh_size de lâentrĂ©e initiale de la table des en-tĂȘtes de sections contient la valeur zĂ©ro.
e_shstrndx
Ce membre contient lâindice dans la table des en-tĂȘtes de sections de lâentrĂ©e associĂ©e Ă la table des chaĂźnes de noms des sections. Si le fichier ne comporte pas de table des chaĂźnes de noms des sections, ce champ contiendra la valeur SHN_UNDEF .
Si lâindice de la section de la table des chaĂźnes de noms des sections est supĂ©rieur ou Ă©gal Ă SHN_LORESERVE (0xff00), ce membre contient la valeur SHN_XINDEX (0xffff) et lâindice rĂ©el de la section de la table des chaĂźnes de noms des sections est stockĂ© dans le membre sh_link de lâentrĂ©e initiale de la table des en-tĂȘtes de sections. Dans le cas contraire, le membre sh_link de lâentrĂ©e initiale de la table des en-tĂȘtes de sections contient la valeur zĂ©ro.
En-tĂȘte de programme (Phdr)
La table dâen-tĂȘte de programme dâun exĂ©cutable ou dâun fichier objet partagĂ© est un tableau de structures, chacune dâentre elles dĂ©crivant un segment ou dâautres informations dont le systĂšme a besoin pour prĂ©parer lâexĂ©cution du programme. Un segment de fichier objet contient une ou plusieurs sections . Lâen-tĂȘte de programme nâa de sens que pour les fichiers objets partagĂ©s ou les fichiers exĂ©cutables. Un fichier indique la taille de son propre en-tĂȘte de programme Ă lâaide des membres e_phentsize et e_phnum de lâen-tĂȘte ELF. Selon lâarchitecture, lâen-tĂȘte de programme ELF est reprĂ©sentĂ© par un type Elf32_Phdr ou un type Elf64_Phdr :
typedef struct
{
uint32_t p_type;
Elf32_Off p_offset;
Elf32_Addr p_vaddr;
Elf32_Addr p_paddr;
uint32_t p_filesz;
uint32_t p_memsz;
uint32_t p_flags;
uint32_t p_align;
} Elf32_Phdr;
typedef struct
{
uint32_t p_type;
uint32_t p_flags;
Elf64_Off p_offset;
Elf64_Addr p_vaddr;
Elf64_Addr p_paddr;
uint64_t p_filesz;
uint64_t p_memsz;
uint64_t p_align;
} Elf64_Phdr;
La principale diffĂ©rence entre lâen-tĂȘte dâun programme 32 bits et lâen-tĂȘte dâun programme 64 bits repose sur lâemplacement du champ p_flags au sein de la structure complĂšte.
|
p_type |
Ce membre de la structure indique le type de segment décrit par cet élément de tableau ou comment interpréter ses informations. |
PT_NULL
Cet Ă©lĂ©ment du tableau est inutilisĂ© et les valeurs des autres membres ne sont pas dĂ©finies. Cela permet Ă lâen-tĂȘte de programme de contenir des entrĂ©es qui ne sont pas prises en compte.
PT_LOAD
Cet Ă©lĂ©ment du tableau indique un segment chargeable, dĂ©crit par p_filesz et p_memsz . Les octets du fichier sont projetĂ©s au dĂ©but du segment mĂ©moire. Si la taille mĂ©moire du segment p_memsz est plus grande que la taille du fichier p_filesz , les octets « supplĂ©mentaires » sont dĂ©finis comme contenant la valeur 0 et placĂ©s Ă la suite de la zone initialisĂ©e du segment. La taille du fichier ne peut ĂȘtre supĂ©rieure Ă la taille de la mĂ©moire. Dans la table dâen-tĂȘte de programme, les entrĂ©es de segments chargeables sont indiquĂ©es par ordre croissant, classĂ©es selon le membre p_vaddr .
PT_DYNAMIC
LâĂ©lĂ©ment de tableau contient des informations de liaison dynamique.
PT_INTERP
LâĂ©lĂ©ment de tableau contient lâemplacement et la taille du nom de chemin, terminĂ© par un octet NULL, utilisĂ© pour invoquer lâinterprĂ©teur. Ce type de segment nâa de sens que pour des fichiers exĂ©cutables (bien quâil puisse ĂȘtre prĂ©sent dans des objets partagĂ©s). Il ne peut ĂȘtre prĂ©sent quâune seule fois dans un fichier. Sâil est prĂ©sent, il doit prĂ©cĂ©der chaque entrĂ©e de segment chargeable.
PT_NOTE
LâĂ©lĂ©ment de tableau spĂ©cifie lâemplacement de notes (ElfN_Nhdr).
PT_SHLIB
Ce type de segment est rĂ©servĂ©, mais sa sĂ©mantique nâest pas dĂ©finie. Les programmes contenant un tel Ă©lĂ©ment de tableau ne sont pas conformes Ă lâinterface binaire (ABI).
PT_PHDR
LâĂ©lĂ©ment de tableau, sâil est prĂ©sent, contiendra lâemplacement et la taille de la table dâen-tĂȘte de programme elle-mĂȘme, Ă la fois dans le fichier et dans lâimage mĂ©moire du programme. Ce type de segment ne peut ĂȘtre prĂ©sent quâune seule fois dans un fichier. Qui plus est, il ne peut ĂȘtre prĂ©sent que si lâen-tĂȘte de programme fait partie de lâimage mĂ©moire du programme. Sâil est prĂ©sent, il doit prĂ©cĂ©der chaque entrĂ©e de segment chargeable.
PT_LOPROC
PT_HIPROC
Les valeurs comprises dans la plage inclusive [ PT_LOPROC , PT_HIPROC ] sont réservées à des sémantiques spécifiques au processeur.
PT_GNU_STACK
Extension GNU qui est utilisĂ©e par le noyau de Linux pour contrĂŽler lâĂ©tat de la pile Ă lâaide de lâindicateur positionnĂ© dans le membre p_flags .
p_offset
Ce membre contient le déplacement du premier octet du segment par rapport au début du fichier.
p_vaddr
Ce membre contient lâadresse virtuelle Ă laquelle se trouve en mĂ©moire le premier octet du segment.
p_paddr
Sur les systĂšmes pour lesquels lâadresse physique est pertinente, ce membre est rĂ©servĂ© pour lâadresse physique du segment. Sous BSD, ce champ nâest pas utilisĂ© et doit avoir la valeur zĂ©ro.
p_filesz
Ce membre contient la taille en octets dans lâimage du fichier de ce segment. Il peut ĂȘtre Ă©gal Ă zĂ©ro.
p_memsz
Ce membre contient la taille en octets de lâimage mĂ©moire de ce segment. Il peut ĂȘtre Ă©gal Ă zĂ©ro.
p_flags
Ce membre contient un masque de bits dâoptions relatives au segment :
|
PF_X |
Segment exécutable. |
|||
|
PF_W |
Segment accessible en écriture. |
|||
|
PF_R |
Segment accessible en lecture. |
Un segment de texte est souvent affecté des drapeaux PF_X et PF_R . Un segment de données est souvent affecté des drapeaux PF_W et PF_R .
p_align
Ce membre contient la valeur selon laquelle les segments sont alignĂ©s en mĂ©moire et dans le fichier. Pour des segments de processus chargeables, les valeurs p_vaddr et p_offset doivent ĂȘtre congrues modulo la taille de la page. Des valeurs de zĂ©ro ou de un indiquent quâaucun alignement nâest nĂ©cessaire. Sinon, p_align doit ĂȘtre un nombre positif, puissance entiĂšre de deux, et p_vaddr doit ĂȘtre Ă©gal Ă p_offset modulo p_align .
En-tĂȘte de section (Shdr)
La table des en-tĂȘtes de sections dâun fichier permet de retrouver toutes les sections du fichier. Câest un tableau de structures Elf32_Shdr ou Elf64_Shdr . Le champ e_shoff de lâen-tĂȘte ELF donne son dĂ©placement en octets depuis le dĂ©but du fichier. e_shnum contient le nombre dâentrĂ©es que contient la table des en-tĂȘtes de sections. e_shentsize contient la taille en octets de chaque entrĂ©e.
Un indice de la
table des en-tĂȘtes de sections est un indice de ce
tableau. Certains de ces indices de table des en-tĂȘtes
de sections sont réservés :
lâentrĂ©e initiale et toutes les entrĂ©es
comprises entre
SHN_LORESERVE
et
SHN_HIRESERVE
. LâentrĂ©e initiale est
utilisée par des extensions ELF pour
e_phnum
,
e_shnum
et
e_shstrndx
; dans les autres
cas, chaque champ de lâentrĂ©e initiale est mis
à zéro. Un fichier objet ne contient pas de
section correspondant Ă ces indices
spéciaux :
SHN_UNDEF
Cette valeur indique une rĂ©fĂ©rence de section non dĂ©finie, manquante, non pertinente ou, dâune maniĂšre ou dâune autre, sans signification.
SHN_LORESERVE
Cette valeur indique la borne inférieure de la plage des indices réservés.
SHN_LOPROC
SHN_HIPROC
Les valeurs supérieures dans la plage inclusive [ SHN_LOPROC , SHN_HIPROC ] sont réservées à des sémantiques spécifiques au processeur.
SHN_ABS
Cette valeur dĂ©finit la valeur absolue de la rĂ©fĂ©rence correspondante. Par exemple, un symbole dĂ©fini par rapport Ă la section numĂ©ro SHN_ABS a une valeur absolue et nâest pas affectĂ© par un repositionnement.
SHN_COMMON
Les symboles définis par rapport à cette section sont des symboles communs, comme des COMMON Fortran ou des variables externes C non allouées.
SHN_HIRESERVE
Cette valeur indique la borne supĂ©rieure de la plage des indices rĂ©servĂ©s. Le systĂšme rĂ©serve les indices compris entre SHN_LORESERVE et SHN_HIRESERVE , inclus. La table des en-tĂȘtes de sections ne contient pas dâentrĂ©e pour les indices rĂ©servĂ©s.
Lâen-tĂȘte de section a la structure suivante :
typedef struct
{
uint32_t sh_name;
uint32_t sh_type;
uint32_t sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
uint32_t sh_size;
uint32_t sh_link;
uint32_t sh_info;
uint32_t sh_addralign;
uint32_t sh_entsize;
} Elf32_Shdr;
typedef struct
{
uint32_t sh_name;
uint32_t sh_type;
uint64_t sh_flags;
Elf64_Addr sh_addr;
Elf64_Off sh_offset;
uint64_t sh_size;
uint32_t sh_link;
uint32_t sh_info;
uint64_t sh_addralign;
uint64_t sh_entsize;
} Elf64_Shdr;
Il nây a
pas de réelle différence entre les
en-tĂȘtes des sections 32 bits et 64 bits.
sh_name
Ce membre indique le nom de la section. Sa valeur est un indice de la table des chaĂźnes des en-tĂȘtes de sections, contenant lâemplacement dâune chaĂźne terminĂ©e par un octet NULL.
sh_type
Ce membre définit le
contenu et la sémantique de la section.
SHT_NULL
Cette valeur indique que cet en-tĂȘte de section est inactif. Il nâest donc associĂ© Ă aucune section. Les valeurs des autres champs de lâen-tĂȘte de section ne sont pas dĂ©finies.
SHT_PROGBITS
Cette section contient des informations définies par le programme, dont le format et le sens ne sont déterminés que par celui-ci.
SHT_SYMTAB
Cette section contient une table de symboles. Typiquement, SHT_SYMTAB contient des symboles pour lâĂ©dition de liens, bien quâelle puisse aussi ĂȘtre utilisĂ©e pour la liaison dynamique. Comme il sâagit dâune table de symboles complĂšte, elle peut contenir de nombreux symboles inutiles Ă la liaison dynamique. Un fichier objet peut aussi contenir une section SHT_DYNSYM .
SHT_STRTAB
Cette section contient une table de chaĂźnes. Un fichier objet peut contenir plusieurs sections de ce type.
SHT_RELA
Cette section contient des entrées de repositionnement ayant des additifs explicites, par exemple les entrées du type Elf32_Rela pour les fichiers objets 32 bits. Un objet peut avoir plusieurs sections de ce type.
SHT_HASH
Cette section contient une table de hachage pour les symboles. Un objet participant Ă une liaison dynamique doit en contenir une. Un fichier objet ne peut contenir quâune seule table de hachage.
SHT_DYNAMIC
Cette section contient les informations de liaison dynamique. Un fichier objet ne peut contenir quâune seule section dynamique.
SHT_NOTE
Cette section contient des notes (ElfN_Nhdr).
SHT_NOBITS
Une section de ce type ressemble Ă SHT_PROGBITS mais nâoccupe pas dâespace dans le fichier. Bien que cette section ne contienne aucun octet, le membre sh_offset contient son dĂ©placement thĂ©orique dans le fichier.
SHT_REL
Cette section contient des entrées de repositionnement sans additif explicite, par exemple du type Elf32_Rel pour les fichiers objets de la classe de 32 bits. Un objet peut contenir plusieurs sections de repositionnement.
SHT_SHLIB
Cette section est rĂ©servĂ©e et sa sĂ©mantique nâest pas dĂ©finie.
SHT_DYNSYM
Cette section contient un jeu minimal de symboles de liaison dynamique. Un fichier objet peut aussi contenir une section SHT_SYMTAB .
SHT_LOPROC
SHT_HIPROC
Les valeurs comprises dans la plage inclusive [ SHT_LOPROC , SHT_HIPROC ] sont réservées à des sémantiques spécifiques au processeur.
SHT_LOUSER
Cette valeur indique la borne inférieure de la plage des indices réservés aux programmes applicatifs.
SHT_HIUSER
Cette valeur indique la borne supĂ©rieure de la plage des indices rĂ©servĂ©s aux programmes applicatifs. Les types de section entre SHT_LOUSER et SHT_HIUSER peuvent ĂȘtre utilisĂ©s par lâapplication, sans que cela nâentre en conflit avec les types de section actuels ou futurs dĂ©finis par le systĂšme.
sh_flags
Les sections contiennent des
indicateurs sous forme dâun bit dĂ©crivant
divers attributs. Si, dans
sh_flags
, le bit
correspondant à un indicateur est positionné,
lâattribut est « activé »
pour cette section. Sinon, lâattribut est
« désactivé » ou ne
sâapplique pas. Les attributs non dĂ©finis sont
mis à zéro.
SHF_WRITE
Cette section contient des donnĂ©es quâil devrait ĂȘtre possible dâĂ©crire durant lâexĂ©cution du processus.
SHF_ALLOC
Cette section est prĂ©sente en mĂ©moire durant lâexĂ©cution du processus. Certaines sections de contrĂŽle ne sont pas prĂ©sentes dans lâimage mĂ©moire dâun fichier objet. Cet attribut est dĂ©sactivĂ© pour ces sections.
SHF_EXECINSTR
Cette section contient des instructions machine exécutables.
SHF_MASKPROC
Tous les bits contenus dans ce masque sont réservés à des sémantiques spécifiques au processeur.
sh_addr
Si cette section apparaĂźt dans lâimage mĂ©moire dâun processus, ce membre contient lâadresse Ă laquelle le premier octet de la section doit se trouver. Sinon, ce membre contient zĂ©ro.
sh_offset
La valeur de ce membre indique le dĂ©placement du premier octet de la section par rapport au dĂ©but du fichier. Une section de type SHT_NOBITS , nâoccupe pas de place dans le fichier et son champ sh_offset indique son emplacement thĂ©orique dans le fichier.
sh_size
Ce membre contient la taille en octets de la section. Ă moins que cette section ne soit de type SHT_NOBITS , elle occupe sh_size octets dans le fichier. Une section de type SHT_NOBITS peut avoir une taille diffĂ©rente de zĂ©ro, mais elle nâoccupera cependant aucune place dans le fichier.
sh_link
Ce membre contient un lien vers un indice de la table des en-tĂȘtes de sections, son interprĂ©tation dĂ©pend du type de section.
sh_info
Ce membre contient des informations complémentaires, son interprétation dépend du type de section.
sh_addralign
Certaines sections ont des contraintes dâalignement dâadresse. Si une section contient un mot double, le systĂšme doit sâassurer que la section tout entiĂšre est alignĂ©e sur les mots doubles. Autrement dit, la valeur de sh_addr doit ĂȘtre congrue Ă zĂ©ro modulo la valeur de sh_addralign . Seules zĂ©ro ou des puissances entiĂšres positives de deux sont autorisĂ©s. Une valeur de zĂ©ro ou de un indique quâaucune contrainte dâalignement ne sâapplique Ă la section.
sh_entsize
Certaines sections contiennent une table dâentrĂ©es de taille fixe, comme les tables de symboles. Pour de telles sections, ce champ donne la taille en octets de chaque entrĂ©e. Ce membre contient zĂ©ro si cette section ne contient pas une table de ce type.
Diverses sections contiennent des informations de contrÎle et sur le programme :
|
.bss |
Cette section contient des donnĂ©es non initialisĂ©es qui contribuent Ă lâimage mĂ©moire du programme. Par dĂ©finition, le systĂšme initialise ces donnĂ©es avec des zĂ©ros lorsque le programme dĂ©marre. Cette section est du type SHT_NOBITS . Les types de ses attributs sont SHF_ALLOC et SHF_WRITE . |
.comment
Cette section contient des informations de suivi des versions. Cette section est du type SHT_PROGBITS . Aucun attribut nâest utilisĂ©.
|
.ctors |
Cette section contient des pointeurs initialisés vers des constructeurs C++. Cette section est du type SHT_PROGBITS . Les types de ses attributs sont SHF_ALLOC et SHF_WRITE . |
||
|
.data |
Cette section contient des donnĂ©es initialisĂ©es qui contribuent Ă lâimage mĂ©moire du programme. Elle est du type SHT_PROGBITS . Les types de ses attributs sont SHF_ALLOC et SHF_WRITE . |
||
|
.data1 |
Cette section contient des donnĂ©es initialisĂ©es qui contribuent Ă lâimage mĂ©moire du programme. Elle est du type SHT_PROGBITS . Les types de ses attributs sont SHF_ALLOC et SHF_WRITE . |
||
|
.debug |
Cette section contient des donnĂ©es de dĂ©bogage symbolique. Son contenu nâest pas prĂ©cisĂ©. Elle est du type SHT_PROGBITS . Aucun type dâattribut nâest utilisĂ©. |
||
|
.dtors |
Cette section contient des pointeurs initialisés vers des destructeurs C++. Elle est du type SHT_PROGBITS . Les types de ses attributs sont SHF_ALLOC et SHF_WRITE . |
.dynamic
Cette section contient des informations de liaison dynamique. Les attributs de cette section comprennent le bit SHF_ALLOC . Le positionnement du bit SHF_WRITE est spécifique au processeur. Cette section est du type SHT_DYNAMIC . Voir ci-dessus pour les attributs.
.dynstr
Cette section contient les chaĂźnes nĂ©cessaires Ă la liaison dynamique, le plus souvent les chaĂźnes reprĂ©sentant les noms associĂ©s aux entrĂ©es de la table des symboles. Cette section est du type SHT_STRTAB . Le type dâattribut utilisĂ© est SHF_ALLOC .
.dynsym
Cette section contient la table des symboles de liaison dynamique. Cette section est du type SHT_DYNSYM . Le type dâattribut utilisĂ© est SHF_ALLOC .
|
.fini |
Cette section contient des instructions exĂ©cutables qui font partie du code de fin du processus. Lorsquâun programme se termine normalement, le systĂšme organise lâexĂ©cution du code de cette section. Elle est du type SHT_PROGBITS . Les attributs utilisĂ©s sont SHF_ALLOC et SHF_EXECINSTR . |
.gnu.version
Cette section contient la table des symboles de version, un tableau dâĂ©lĂ©ments ElfN_Half . Cette section est du type SHT_GNU_versym . Le type dâattribut utilisĂ© est SHF_ALLOC .
.gnu.version_d
Cette section contient les dĂ©finitions de version de symboles, une table de structures ElfN_Verdef . Cette section est du type SHT_GNU_verdef . Le type dâattribut utilisĂ© est SHF_ALLOC .
.gnu.version_r
Cette section contient la version de symbole des Ă©lĂ©ments nĂ©cessaires, une table de structures ElfN_Verneed . Cette section est du type SHT_GNU_versym . Le type dâattribut utilisĂ© est SHF_ALLOC .
|
.got |
Cette section contient la table globale des déplacements. Elle est du type SHT_PROGBITS . Les attributs sont spécifiques au processeur. |
||
|
.hash |
Cette section contient la table de hachage des symboles. Elle est du type SHT_HASH . Lâattribut utilisĂ© est SHF_ALLOC . |
||
|
.init |
Cette section contient des instructions exĂ©cutables qui font partie du code dâinitialisation du processus. Lorsquâun programme dĂ©marre, le systĂšme organise lâexĂ©cution du code de cette section avant dâappeler le point dâentrĂ©e principal du programme. Cette section est du type SHT_PROGBITS . Les attributs utilisĂ©s sont SHF_ALLOC et SHF_EXECINSTR . |
.interp
Cette section contient le chemin vers un interpréteur de programmes. Si le fichier comporte un segment chargeable contenant cette section, les attributs de la section contiendront le bit SHF_ALLOC . Sinon, ce bit sera désactivé. Cette section est du type SHT_PROGBITS .
|
.line |
Cette section contient des informations sur les numĂ©ros de lignes, qui seront utilisĂ©es pour le dĂ©bogage symbolique. Ces informations Ă©tablissent la correspondance entre le code source du programme et le code machine. Le contenu de cette section nâest pas spĂ©cifiĂ©. Cette section est du type SHT_PROGBITS . Aucun attribut nâest utilisĂ©. |
||
|
.note |
Cette section contient diverses notes. Elle est du type SHT_NOTE . Aucun type dâattribut. |
.note.ABI-tag
Cette section est utilisĂ©e pour dĂ©clarer lâABI dâexĂ©cution attendue de lâimage ELF. Elle peut comprendre le nom du systĂšme dâexploitation et ses versions dâexĂ©cution. Cette section est du type SHT_NOTE . Le seul attribut utilisĂ© est SHF_ALLOC .
.note.gnu.build-id
Cette section est utilisĂ©e pour conserver un identifiant unique du contenu de lâimage ELF. DiffĂ©rents fichiers avec le mĂȘme identifiant de construction pourraient contenir le mĂȘme contenu exĂ©cutable. Voir lâoption --build-id de lâĂ©diteur de liens GNU ( ld (1)) pour plus de dĂ©tails. Cette section est du type SHT_NOTE . Le seul attribut utilisĂ© est SHF_ALLOC .
.note.GNU-stack
Cette section est utilisĂ©e dans les fichiers objets de Linux pour dĂ©clarer les attributs de la pile. Cette section est du type SHT_PROGBITS . Le seul attribut utilisĂ© est SHF_EXECINSTR . Cela indique Ă lâĂ©diteur de liens GNU que le fichier objet requiert une pile exĂ©cutable.
.note.openbsd.ident
Les exĂ©cutables natifs dâOpenBSD contiennent en gĂ©nĂ©ral une section .note.openbsd.ident leur permettant de sâidentifier afin que le noyau court-circuite, lors du chargement du fichier, tous les tests de compatibilitĂ© de lâĂ©mulation binaire ELF.
|
.plt |
Cette section contient une table de liaison des procédures. Elle est du type SHT_PROGBITS . Ses attributs sont spécifiques au processeur. |
.relNOM
Cette section contient des informations de repositionnement, comme dĂ©crit ci-dessous. Si ce fichier comporte un segment chargeable comprenant du repositionnement, les attributs de la section contiendront le bit SHF_ALLOC . Sinon, ce bit sera dĂ©sactivĂ©. Par convention, le « NOM » est fourni par la section Ă laquelle le repositionnement sâapplique. Ainsi, une section de repositionnement pour du .text sâappellera normalement .rel.text . Cette section est du type SHT_REL .
.relaNOM
Cette section contient des informations de repositionnement, comme dĂ©crit ci-dessous. Si ce fichier comporte un segment chargeable comprenant du repositionnement, les attributs de la section contiendront le bit SHF_ALLOC . Sinon, ce bit sera dĂ©sactivĂ©. Par convention, le « NOM » est fourni par la section Ă laquelle le repositionnement sâapplique. Ainsi, une section de repositionnement pour du .text sâappellera normalement .rela.text . Cette section est du type SHT_RELA .
.rodata
Cette section contient des donnĂ©es en lecture seule, qui feront classiquement partie dâun segment non accessible en Ă©criture dans lâimage du processus. Cette section est du type SHT_PROGBITS . Lâattribut utilisĂ© est SHF_ALLOC .
.rodata1
Cette section contient des donnĂ©es en lecture seule, qui feront classiquement partie dâun segment non accessible en Ă©criture dans lâimage du processus. Cette section est du type SHT_PROGBITS . Lâattribut utilisĂ© est SHF_ALLOC .
.shstrtab
Cette section contient les noms des sections. Elle est du type SHT_STRTAB . Aucun type dâattribut.
.strtab
Cette section contient des chaßnes, le plus souvent ces chaßnes représentent les noms associés aux entrées de la table des symboles. Si ce fichier comporte un segment chargeable comprenant la table des chaßnes de symboles, les attributs de la section contiendront le bit SHF_ALLOC . Sinon, ce bit sera désactivé. Cette section est du type SHT_STRTAB .
.symtab
Cette section contient une table des symboles. Si ce fichier comporte un segment chargeable contenant la table des symboles, les attributs de la section contiendront le bit SHF_ALLOC . Sinon, ce bit sera désactivé. Cette section est du type SHT_SYMTAB .
|
.text |
Cette section contient le « texte », autrement dit les instructions exĂ©cutables, dâun programme. Cette section est du type SHT_PROGBITS . Les attributs utilisĂ©s sont SHF_ALLOC et SHF_EXECINSTR . |
Table des chaĂźnes et des symboles
Les sections de tables de chaĂźnes contiennent des sĂ©quences de caractĂšres terminĂ©es par un octet NULL, communĂ©ment appelĂ©es chaĂźnes. Le fichier objet utilise ces chaĂźnes pour reprĂ©senter les noms des symboles et des sections. Une chaĂźne peut ĂȘtre vue comme un indice dans la section de table de chaĂźnes. Le premier octet, qui est lâindice zĂ©ro, est dĂ©fini comme contenant un octet NULL(« \0 »). De mĂȘme, le dernier octet de la table de chaĂźnes est dĂ©fini comme contenant un octet NULL, ce qui assure que toutes les chaĂźnes se termineront bien par un octet NULL.
La table des symboles dâun fichier objet contient les informations permettant de localiser et de repositionner les dĂ©finitions et rĂ©fĂ©rences symboliques dâun programme. Un indice dans une table de symbole est un indice de ce tableau.
typedef struct
{
uint32_t st_name;
Elf32_Addr st_value;
uint32_t st_size;
unsigned char st_info;
unsigned char st_other;
uint16_t st_shndx;
} Elf32_Sym;
typedef struct
{
uint32_t st_name;
unsigned char st_info;
unsigned char st_other;
uint16_t st_shndx;
Elf64_Addr st_value;
uint64_t st_size;
} Elf64_Sym;
Les versions 32
bits et 64 bits comportent les mĂȘmes membres, seul
leur ordre diffĂšre.
st_name
Ce membre contient un indice de la table des chaĂźnes de symboles dâun fichier objet. Cette table contient la reprĂ©sentation sous la forme de chaĂźnes de caractĂšres des noms des symboles. Si la valeur de ce champ est diffĂ©rente de zĂ©ro, il reprĂ©sente lâindice de la table des chaĂźnes qui donne son nom au symbole. Sinon, le symbole nâa pas de nom.
st_value
Ce membre donne la valeur associée au symbole.
st_size
De nombreux symboles sont associĂ©s Ă des tailles. Ce champ contient zĂ©ro si le symbole nâa pas de taille ou si sa taille est inconnue.
st_info
Ce membre indique le type de
symbole et ses attributs de liaison :
STT_NOTYPE
Le type de ce symbole nâest pas dĂ©fini.
STT_OBJECT
Ce symbole est associé à un objet de données.
STT_FUNC
Ce symbole est associé à une fonction ou un autre code exécutable.
STT_SECTION
Ce symbole est associé à une section. Les entrées de ce type de la table des symboles existent principalement pour le repositionnement et ont normalement des liaisons STB_LOCAL .
STT_FILE
Par convention, le nom de ce symbole donne le nom du fichier source associĂ© au fichier objet. Un symbole de ce type a des liaisons STB_LOCAL , son indice de section est SHN_ABS , et, sâil est prĂ©sent, il prĂ©cĂšde les autres symboles STB_LOCAL du fichier.
STT_LOPROC
STT_HIPROC
Les valeurs comprises dans la plage inclusive [ STT_LOPROC , STT_HIPROC ] incluse sont réservées à des sémantiques spécifiques au processeur.
STB_LOCAL
Les symboles locaux ne sont pas visibles en dehors du fichier objet contenant leur dĂ©finition. Des symboles locaux de mĂȘme nom peuvent exister dans plusieurs fichiers sans interfĂ©rer entre eux.
STB_GLOBAL
Les symboles globaux sont visibles de tous les fichiers objets devant ĂȘtre rĂ©unis. La dĂ©finition par un fichier dâun symbole global satisfera une rĂ©fĂ©rence non dĂ©finie dâun autre fichier Ă ce mĂȘme symbole.
STB_WEAK
Les symboles faibles ressemblent à des symboles globaux, mais leur définition a une priorité plus faible.
STB_LOPROC
STB_HIPROC
Les valeurs comprises dans la plage inclusive [ STB_LOPROC , STB_HIPROC ] incluse sont réservées à des sémantiques spécifiques au processeur.
Il existe des
macros permettant dâempaqueter et dĂ©paqueter
les champs de type et de liaison :
ELF32_ST_BIND(
info
)
ELF64_ST_BIND(
info
)
Extraire une liaison dâune valeur st_info .
ELF32_ST_TYPE(
info
)
ELF64_ST_TYPE(
info
)
Extraire un type dâune valeur st_info .
ELF32_ST_INFO(
liaison
,
type
)
ELF64_ST_INFO(
liaison
,
type
)
Convertir une liaison et un type en une valeur st_info .
st_other
Ce membre définit la
visibilité du symbole.
STV_DEFAULT
RĂšgles de visibilitĂ© des symboles par dĂ©faut. Les symboles globaux et les symboles faibles sont disponibles pour dâautres modules ; les dĂ©finitions dans dâautres modules peuvent sâinterposer dans les rĂ©fĂ©rences du module local.
STV_INTERNAL
Classe cachée spécifique au processeur.
STV_HIDDEN
Le symbole nâest pas disponible pour dâautres modules ; les rĂ©fĂ©rences du module local se rĂ©solvent toujours dans le symbole local (câest-Ă -dire les dĂ©finitions des autres modules ne peuvent sâinterposer dans le symbole).
STV_PROTECTED
Le symbole est disponible pour dâautres modules, mais les rĂ©fĂ©rences du module local se rĂ©solvent toujours dans le symbole local.
Il existe des macros permettant dâextraire le type de visibilité :
ELF32_ST_VISIBILITY (autre) ou ELF64_ST_VISIBILITY (autre)
st_shndx
Chaque entrĂ©e de la table des symboles est « dĂ©finie » en relation avec une section. Ce membre contient lâindice correspondant de la table des en-tĂȘtes de sections.
Entrées de repositionnement (Rel et Rela)
Le repositionnement est le processus consistant Ă relier des rĂ©fĂ©rences symboliques Ă des dĂ©finitions symboliques. Les fichiers repositionnables doivent contenir des informations dĂ©crivant comment modifier le contenu de leurs sections, ce qui permet aux fichiers objets partagĂ©s et exĂ©cutables de dĂ©tenir les bonnes informations concernant lâimage mĂ©moire dâun programme. Les entrĂ©es de repositionnement sont ces donnĂ©es.
Structures de repositionnement pour lesquelles un additif nâest pas nĂ©cessaire :
typedef struct
{
Elf32_Addr r_offset;
uint32_t r_info;
} Elf32_Rel;
typedef struct
{
Elf64_Addr r_offset;
uint64_t r_info;
} Elf64_Rel;
Structures de repositionnement pour lesquelles un additif est nécessaire :
typedef struct
{
Elf32_Addr r_offset;
uint32_t r_info;
int32_t r_addend;
} Elf32_Rela;
typedef struct
{
Elf64_Addr r_offset;
uint64_t r_info;
int64_t r_addend;
} Elf64_Rela;
r_offset
Ce membre donne lâemplacement oĂč appliquer lâaction de repositionnement. Pour un fichier repositionnable, sa valeur est le dĂ©placement en octets depuis le dĂ©but de la section jusquâĂ lâunitĂ© de stockage affectĂ©e par le repositionnement. Pour un fichier exĂ©cutable ou un objet partagĂ©, sa valeur est lâadresse virtuelle de lâunitĂ© de stockage affectĂ©e par le repositionnement.
|
r_info |
Ce membre donne Ă la fois lâindice de la table des symboles par rapport auquel on doit effectuer le repositionnement et le type de repositionnement Ă appliquer. Les types de repositionnement dĂ©pendent du processeur. Lorsque le texte mentionne le type de repositionnement ou lâindice de la table des symboles dâune entrĂ©e de repositionnement, il sâagit du rĂ©sultat de lâapplication de ELF[32|64]_R_TYPE ou ELF[32|64]_R_SYM , respectivement, au champ r_info de cette entrĂ©e. |
r_addend
Ce membre indique un additif constant pour le calcul de la valeur Ă stocker dans le champ repositionnable.
Ătiquettes dynamiques (Dyn)
La section .dynamic comporte une sĂ©rie de structures qui contiennent les informations relatives Ă lâĂ©dition de liens dynamique. Le membre d_tag contrĂŽle lâinterprĂ©tation de d_un .
typedef struct
{
Elf32_Sword d_tag;
union {
Elf32_Word d_val;
Elf32_Addr d_ptr;
} d_un;
} Elf32_Dyn;
extern Elf32_Dyn _DYNAMIC[];
typedef struct
{
Elf64_Sxword d_tag;
union {
Elf64_Xword d_val;
Elf64_Addr d_ptr;
} d_un;
} Elf64_Dyn;
extern Elf64_Dyn _DYNAMIC[];
|
d_tag |
Ce membre peut prendre lâune des trois valeurs suivantes : |
DT_NULL
|
Indication de la fin de la section dynamique |
|||
|
DT_NEEDED |
DĂ©placement dans la table des chaĂźnes vers le nom dâune bibliothĂšque nĂ©cessaire |
||
|
DT_PLTRELSZ |
Taille en octets des entrées de repositionnement PLT |
||
|
DT_PLTGOT |
Adresse de PLT et/ou de GOT |
||
|
DT_HASH |
Adresse de la table de hachage des symboles |
||
|
DT_STRTAB |
Adresse de la table des chaĂźnes |
||
|
DT_SYMTAB |
Adresse de la table des symboles |
||
|
DT_RELA |
Adresse de la table de repositionnement Rela |
||
|
DT_RELASZ |
Taille en octets de la table de repositionnement Rela |
||
|
DT_RELAENT |
Taille en octets dâune entrĂ©e de la table de repositionnement Rela |
||
|
DT_STRSZ |
Taille en octets de la table des chaĂźnes |
||
|
DT_SYMENT |
Taille en octets dâune entrĂ©e de la table des symboles |
||
|
DT_INIT |
Adresse de la fonction dâinitialisation |
||
|
DT_FINI |
Adresse de la fonction de terminaison |
||
|
DT_SONAME |
DĂ©placement dans la table des chaĂźnes vers le nom de lâobjet partagĂ© |
||
|
DT_RPATH |
Déplacement dans la table des chaßnes pour le chemin de recherche des dépendances directes et indirectes de la bibliothÚque |
||
|
DT_SYMBOLIC |
Demander Ă lâĂ©diteur de liens de rechercher les symboles dans cet objet partagĂ© avant lâexĂ©cutable |
||
|
DT_REL |
Adresse de la table de repositionnement Rel |
||
|
DT_RELSZ |
Taille en octets de la table de repositionnement Rela |
||
|
DT_RELENT |
Taille en octets dâune entrĂ©e de la table Rel |
||
|
DT_PLTREL |
Type dâentrĂ©e de repositionnement auquel se rĂ©fĂšre PLT (Rela ou Rel) |
||
|
DT_DEBUG |
Utilisation non définie pour le débogage |
||
|
DT_TEXTREL |
Son absence indique quâaucune entrĂ©e de repositionnement ne devrait sâappliquer Ă un segment non accessible en Ă©criture |
||
|
DT_JMPREL |
Adresse des entrées de repositionnement, associées uniquement à la PLT |
||
|
DT_BIND_NOW |
Enjoindre Ă lâĂ©diteur de liens dynamique de traiter tous les repositionnements avant de transfĂ©rer le contrĂŽle Ă lâexĂ©cutable |
||
|
DT_RUNPATH |
Déplacement dans la table des chaßnes pour le chemin de recherche des dépendances directes de la bibliothÚque |
||
|
DT_LOPROC |
|||
|
DT_HIPROC |
Les valeurs comprises dans la plage inclusive [ DT_LOPROC , DT_HIPROC ] sont réservées à des sémantiques spécifiques au processeur. |
||
|
d_val |
Ce membre représente des valeurs entiÚres ayant des interprétations diverses.
|
d_ptr |
Ce membre reprĂ©sente les adresses virtuelles du programme. Lors de lâinterprĂ©tation de ces adresses, lâadresse rĂ©elle doit ĂȘtre calculĂ©e en se basant sur la valeur originale du fichier et sur lâadresse de base de la mĂ©moire. Les fichiers ne contiennent pas dâentrĂ©es de repositionnement pour corriger ces adresses. |
_DYNAMIC
Tableau contenant toutes les structures dynamiques de la section .dynamic . Cela est automatiquement rempli par lâĂ©diteur de liens.
Notes (Nhdr)
Les notes dâELF permettent dâajouter des informations arbitraires pour le systĂšme Ă utiliser. Elles sont largement utilisĂ©es par les fichiers core ( e_type de ET_CORE ), mais de nombreux projets dĂ©finissent leur propre jeu dâextensions. Par exemple, la chaĂźne de compilation GNU utilise les notes dâELF pour passer des informations de lâĂ©diteur de liens Ă la bibliothĂšque C.
Les sections note contiennent une sĂ©rie de notes (voir les dĂ©finitions struct plus loin). Chaque note est suivie par le champ nom (dont la longueur est dĂ©finie dans n_namesz ), puis par le champ descripteur (dont la longueur est dĂ©finie dans n_descsz ) et dont lâadresse de dĂ©part a un alignement de 4 octets. Aucun champ nâest dĂ©fini dans la structure de note Ă cause de leur longueur arbitraire.
Un exemple pour analyser deux notes consécutives peut clarifier leur disposition en mémoire :
void *memory,
*name, *desc;
Elf64_Nhdr *note, *next_note;
/* Le tampon pointe vers le début de la section ou du
segment. */
note = memory;
/* Si le descripteur est défini, il suit la note. */
name = note->n_namesz == 0 ? NULL : memory +
sizeof(*note);
/* Si le descripteur est défini, il suit le nom*/
(avec lâalignement). */
desc = note->n_descsz == 0 ? NULL :
memory + sizeof(*note) + ALIGN_UP(note->n_namesz, 4);
/* La note suivante suit les deux (avec lâalignement).
*/
next_note = memory + sizeof(*note) +
ALIGN_UP(note->n_namesz, 4) +
ALIGN_UP(note->n_descsz, 4);
Garder en mĂ©moire que lâinterprĂ©tation de n_type dĂ©pend de lâespace de noms dĂ©fini par le champ n_namesz . Si le champ n_namesz nâest pas dĂ©fini (par exemple, est 0), il y a deux jeux de notes : un pour les fichiers core et un pour tous les autres types dâELF. Si lâespace de noms est inconnu, les outils se replieront aussi habituellement sur ces jeux de notes.
typedef struct
{
Elf32_Word n_namesz;
Elf32_Word n_descsz;
Elf32_Word n_type;
} Elf32_Nhdr;
typedef struct
{
Elf64_Word n_namesz;
Elf64_Word n_descsz;
Elf64_Word n_type;
} Elf64_Nhdr;
n_namesz
La longueur du champ nom en octets. Le contenu suivra immédiatement cette note dans la mémoire. Le nom se termine par un octet NULL. Par exemple, si le nom est « GNU », n_namesz sera défini à  4.
n_descsz
La longueur du champ descripteur en octets. Le contenu suivra immédiatement le champ du nom dans la mémoire.
|
n_type |
Selon la valeur du champ nom, ce membre peut prendre lâune des trois valeurs suivantes : |
Core files (e_type = ET_CORE)
Notes utilisĂ©es par les fichiers core. Elles sont trĂšs spĂ©cifiques au systĂšme dâexploitation ou Ă lâarchitecture et requiĂšrent souvent une Ă©troite coordination avec les noyaux, les bibliothĂšques C et les dĂ©bogueurs. Elles sont utilisĂ©es quand lâespace de noms est celui par dĂ©faut (câest-Ă -dire n_namesz sera dĂ©fini Ă Â 0), ou un repli est utilisĂ© quand lâespace de noms est inconnu).
|
NT_PRSTATUS |
structure prstatus |
||
|
NT_FPREGSET |
structure fpregset |
||
|
NT_PRPSINFO |
structure prpsinfo |
||
|
NT_PRXREG |
structure prxregset |
||
|
NT_TASKSTRUCT |
structure tĂąche |
||
|
NT_PLATFORM |
ChaĂźne Ă partir de sysinfo(SI_PLATFORM) |
||
|
NT_AUXV |
tableau dâauxv |
||
|
NT_GWINDOWS |
structure gwindows |
||
|
NT_ASRS |
structure asrset |
||
|
NT_PSTATUS |
structure pstatus |
||
|
NT_PSINFO |
structure psinfo |
||
|
NT_PRCRED |
structure prcred |
||
|
NT_UTSNAME |
structure utsname |
||
|
NT_LWPSTATUS |
structure lwpstatus |
||
|
NT_LWPSINFO |
structure lwpinfo |
||
|
NT_PRFPXREG |
structure fprxregset |
||
|
NT_SIGINFO |
siginfo_t (sa taille peut croĂźtre avec le temps) |
||
|
NT_FILE |
Contient des informations sur les fichiers projetés |
||
|
NT_PRXFPREG |
user_fxsr_struct |
||
|
NT_PPC_VMX |
registres Altivec/VMX de PowerPC |
||
|
NT_PPC_SPE |
registres SPE/EVR de PowerPC |
||
|
NT_PPC_VSX |
registres VSX de PowerPC |
||
|
NT_386_TLS |
emplacements TLS du i386 (structure user_desc) |
||
|
NT_386_IOPERM |
bitmap de permission E/S du x86 (1=refus) |
||
|
NT_X86_XSTATE |
état étendu du x86 utilisant xsave |
||
|
NT_S390_HIGH_GPRS |
moitiés supérieures des registres du s390 |
||
|
NT_S390_TIMER |
registre du temporisateur du s390 |
||
|
NT_S390_TODCMP |
registre du comparateur dâhorloge TOD (heure du jour) du s390 |
||
|
NT_S390_TODPREG |
registre programmable du TOD du s390 |
||
|
NT_S390_CTRS |
registres de contrĂŽle du s390 |
||
|
NT_S390_PREFIX |
registre de préfixe du s390 |
||
|
NT_S390_LAST_BREAK |
adresse dâĂ©vĂ©nement dâarrĂȘt du s390 |
||
|
NT_S390_SYSTEM_CALL |
donnĂ©es de redĂ©marrage dâappel systĂšme du s390 |
||
|
NT_S390_TDB |
bloc de diagnostic de transaction du S390 |
||
|
NT_ARM_VFP |
registre VFP/NEON dâARM |
||
|
NT_ARM_TLS |
registre TLS dâARM |
||
|
NT_ARM_HW_BREAK |
registres de point dâarrĂȘt matĂ©riel dâARM |
||
|
NT_ARM_HW_WATCH |
registres de point dâobservation matĂ©riel dâARM |
||
|
NT_ARM_SYSTEM_CALL |
numĂ©ro de lâappel systĂšme dâARM |
n_name = GNU
Extensions utilisées par
la chaĂźne de compilation GNU.
NT_GNU_ABI_TAG
Information sur lâABI du systĂšme dâexploitation (OS). Le champ desc sera composĂ© de quatre mots :
|
[0] |
descripteur du systĂšme dâexploitation ( ELF_NOTE_OS_LINUX , ELF_NOTE_OS_GNU , etc.) |
||
|
[1] |
version majeure de lâABI |
||
|
[2] |
version mineure de lâABI |
||
|
[3] |
version sous-mineure de lâABI |
NT_GNU_HWCAP
Information synthétique sur les capacités matérielles (hwcap). Le champ desc commence par deux mots :
|
[0] |
nombre dâentrĂ©es |
|||
|
[1] |
masque de bits des entrées activées. |
Puis suivent les entrĂ©es Ă longueur variable, un octet suivi dâune chaĂźne terminĂ©e par un octet NULL de nom de « hwcap ». Lâoctet donne le numĂ©ro du bit Ă tester sâil est activĂ©, (1U << bit) & masque de bits.
NT_GNU_BUILD_ID
Identifiant unique de construction tel que gĂ©nĂ©rĂ© par lâoption --build-id de GNU ld (1). Le desc consiste en nâimporte quel nombre dâoctets diffĂ©rent de zĂ©ro.
NT_GNU_GOLD_VERSION
Le desc contient la version de lâĂ©diteur de liens Gold de GNU utilisĂ©.
Default/unknown namespace (e_type != ET_CORE)
Elles sont utilisĂ©es quand lâespace de noms est celui par dĂ©faut (câest-Ă -dire n_namesz sera dĂ©fini Ă Â 0), ou un repli est utilisĂ© quand lâespace de noms est inconnu).
|
NT_VERSION |
Une chaĂźne de version dâun certain type. |
|||
|
NT_ARCH |
Information sur lâarchitecture. |
NOTES
ELF est apparu dâabord dans le System V. Le format ELF est une norme adoptĂ©e.
Les extensions pour e_phnum , e_shnum et e_strndx sont des extensions Linux. Sun, BSD et AMD64 les gĂšrent aussi. Pour plus dâinformations, veuillez lire la section VOIR AUSSI.
VOIR AUSSI
as (1), elfedit (1), gdb (1), ld (1), nm (1), objcopy (1), objdump (1), patchelf (1), readelf (1), size (1), strings (1), strip (1), execve (2), dl_iterate_phdr (3), core (5), ld.so (8)
Hewlett-Packard, Format de fichiers Elf-64 ( Elf-64 Object File Format ).
Santa Cruz Operation, Interface binaire des applications System V ( System V Application Binary Interface ).
UNIX System Laboratories, « Object Files », Format des fichiers exécutables ELF ( Executable and Linking Format )
Sun Microsystems, Guide de lâĂ©diteur de liens et des bibliothĂšques ( Linker and Libraries Guide ).
Version prĂ©liminaire de lâABI AMD64 ( System V Application Binary Interface. AMD64 Architecture Processor Supplement â Interface binaire des applications System V).
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>
Cette traduction est une documentation libre ; veuillez vous reporter Ă la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il nây a aucune RESPONSABILITĂ LĂGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .