Eksekverbart og linkbart format
Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den
version , der blev gennemgået den 7. juni 2021; checks kræver
6 redigeringer .
ELF ( engelsk Executable and Linkable Format - eksekverbart og linkbart filformat) er et binært filformat, der bruges i mange moderne UNIX-lignende operativsystemer, såsom FreeBSD , Linux , Solaris , osv.
Historie
ELF-formatstandarden blev oprindeligt udviklet og udgivet af som en del af UNIX System V binære applikationsgrænseflade [1] . Det blev derefter udvalgt af -udvalget og udviklet som et bærbart format til forskellige operativsystemer, der kører på 32-bit Intel x86 hardwarearkitekturen . [2] ELF vandt hurtigt popularitet, og efter at HP udvidede formatet og udgav ELF-64-standarden, spredte det sig til 64-bit platforme. [3]
Typer
ELF-formatstandarden skelner mellem flere typer filer:
- Flytbar fil - gemmer instruktioner og data, der kan linkes til andre objektfiler . Resultatet af et sådant link kan være en delt objektfil eller en eksekverbar fil. Denne type inkluderer objektfiler af statiske biblioteker.
- Delt objektfil - indeholder også instruktioner og data og kan associeres med andre flytbare filer og delte objektfiler, som et resultat af hvilke en ny objektfil vil blive oprettet, eller når programmet startes til udførelse, kan operativsystemet dynamisk associere det med programmets eksekverbare fil, som et resultat, som vil skabe et eksekverbart billede af programmet. I sidstnævnte tilfælde taler vi om delte biblioteker.
- Eksekverbar fil - indeholder en komplet beskrivelse, der gør det muligt for systemet at skabe et billede af processen . Inklusive: instruktioner, data, beskrivelse af nødvendige delte objektfiler og nødvendige symbolske og fejlfindingsoplysninger.
Formater
Hver ELF-fil består af følgende dele:
Filoverskrift
Filhovedet (ELF Header) har en fast placering i begyndelsen af filen og indeholder en generel beskrivelse af filstrukturen og dens hovedkarakteristika, såsom: type, formatversion, processorarkitektur , virtuel indgangsadresse , størrelser og offsets andre dele af filen. Headeren er 52 bytes for 32-bit filer eller 64 for 64-bit . Denne forskel skyldes, at filoverskriften indeholder tre felter med en pointerstørrelse, som er 4 og 8 bytes for henholdsvis 32-bit og 64-bit processorer . Disse felter er e_entry, e_phoffog e_shoff.
ELF-filoverskriftsfelter
Størrelsen
|
Navn |
Formål
|
NISSE
32
|
NISSE
64
|
16
|
e_ident[16] |
Filens generelle karakteristika.
Array bytese_ident
Indeks
|
Navn
|
Formål
|
0 - 3
|
EI_MAG0-EI_MAG3
|
Fil signatur 0x7f 0x45 0x4c 0x46:.
|
fire
|
EI_CLASS
|
Objekt fil klasse.
Navn
|
Betyder
|
Beskrivelse
|
ELFCLASSNONE
|
0
|
Forkert klasse
|
ELFCLASS32
|
en
|
32-bit objektfil
|
ELFCLASS64
|
2
|
64-bit objektfil
|
|
5
|
EI_DATA
|
Processorafhængig datakodningsmetode.
|
6
|
EI_VERSION
|
ELF-versionen af overskriften. I øjeblikket skal værdien af denne byte være EV_CURRENT.
Navn
|
Betyder
|
EV_CURRENT
|
en
|
|
7
|
EI_OSABI
|
Operativsystem eller ABI - specifikke udvidelser, der bruges i filen. Nogle felter i andre ELF-filstrukturer har flag og felter, hvis betydning afhænger af operativsystemet eller ABI; fortolkningen af disse felter bestemmes af værdien af den givne byte. Hvis objektfilen ikke bruger filtypenavne, anbefales det, at denne byte sættes til 0. Hvis værdien for denne byte er i intervallet fra 64til 255, afhænger dens fortolkning af værdien af e_machine ELF header-feltet. I dette interval kan hver arkitektur definere sit eget værdisæt.
Navn
|
Betyder
|
Beskrivelse
|
ELFOSABI_NONE
|
0
|
UNIX System V ABI
|
ELFOSABI_HPUX
|
en
|
HP-UX
|
ELFOSABI_NETBSD
|
2
|
NetBSD
|
ELFOSABI_GNU
|
3
|
Filen bruger GNU ELF-udvidelser ( GNU/Linux )
|
ELFOSABI_SOLARIS
|
6
|
Solaris
|
ELFOSABI_AIX
|
7
|
AIX
|
ELFOSABI_IRIX
|
otte
|
IRIX
|
ELFOSABI_FREEBSD
|
9
|
FreeBSD
|
ELFOSABI_TRU64
|
ti
|
Tru64 UNIX
|
ELFOSABI_MODESTO
|
elleve
|
Modesto
|
ELFOSABI_OPENBSD
|
12
|
OpenBSD
|
ELFOSABI_OPENVMS
|
13
|
åbenvms
|
ELFOSABI_NSK
|
fjorten
|
Non Stop Kernel
|
ELFOSABI_AROS
|
femten
|
Amiga Research OS
|
ELFOSABI_FENIXOS
|
16
|
fenixOS
|
ELFOSABI_CLOUDABI
|
17
|
CloudABI
|
ELFOSABI_OPENVOS
|
atten
|
OpenVOS
|
|
64 - 255
|
Processorafhængige værdier
|
|
otte
|
EI_ABIVERSION
|
ABI version.
|
9
|
EI_PAD
|
T.n. padding bytes (fyld). Array-elementer reserveret til fremtidig brug e_ident. Normalt installeret i 0. Objektfillæsere bør ignorere dem.
|
ti
|
EI_PAD + 1
|
elleve
|
EI_PAD + 2
|
12
|
EI_PAD + 3
|
13
|
EI_PAD + 4
|
fjorten
|
EI_PAD + 5
|
femten
|
EI_PAD + 6
|
|
2
|
e_type |
Filtype.
Navn
|
Betyder
|
Beskrivelse
|
ET_NONE
|
0
|
Usikker
|
ET_REL
|
en
|
Filen flyttes
|
ET_EXEC
|
2
|
Eksekverbar
|
ET_DYN
|
3
|
Delt objektfil
|
ET_CORE
|
fire
|
kernefil
|
ET_LOOS-ET_HIOS
|
65024 - 65279
|
Operativsystemafhængige værdier
|
ET_LOPROC-ET_HIPROC
|
65280 - 65535
|
Processorafhængige værdier
|
|
2
|
e_machine |
Arkitekturen af hardwareplatformen, som filen blev oprettet til:
Navn
|
Betyder
|
Beskrivelse
|
EM_NONE
|
0x0
|
Udefineret
|
EM_M32
|
0x01 |
AT&T WE 32100
|
EM_SPARC
|
0x02 |
SPARC
|
EM_386
|
0x03
|
Intel 80386
|
EM_68K
|
0x04 |
Motorola 68000 (M68k)
|
EM_88K
|
0x05 |
Motorola 88000 (M88k)
|
EM_IAMCU
|
0x06 |
Intel MCU
|
EM_860
|
0x07 |
Intel 80860
|
EM_MIPS
|
0x08 |
MIPS
|
EM_S370
|
0x09 |
IBM_System/370
|
EM_MIPS_RS3_LE
|
0x0A |
MIPS R3000 Little-endian
|
|
0x0B - 0x0E |
Reserveret til fremtidig brug
|
EM_PARISC
|
0x0F |
Hewlett-Packard PA-RISC
|
|
0x10 |
Reserveret til fremtidig brug
|
EM_960
|
0x13 |
Intel 80960
|
EM_PPC
|
0x14
|
PowerPC
|
EM_PPC64
|
0x15
|
PowerPC (64-bit)
|
EM_S390
|
0x16 |
S390 , inklusive S390x
|
EM_SPU
|
0x17 |
IBM SPU/SPC
|
|
0x18 - 0x23 |
Reserveret til fremtidig brug
|
EM_V800
|
0x24 |
NEC V800
|
EM_FR20
|
0x25 |
Fujitsu FR20
|
EM_RH32
|
0x26 |
TRW RH-32
|
EM_MCOREogEM_RCE
|
0x27 |
Motorola RCE
|
EM_ARM
|
0x28 |
ARM (op til ARMv7/Aarch32)
|
EM_OLD_ALPHA
|
0x29 |
Digital Alpha
|
EM_SH
|
0x2A |
superh
|
EM_SPARCV9
|
0x2B |
SPARC version 9
|
EM_TRICORE
|
0x2C |
Siemens TriCore indlejret processor
|
EM_ARC
|
0x2D |
Argonaut RISC Core
|
EM_H8_300
|
0x2E |
Hitachi H8/300
|
EM_H8_300H
|
0x2F |
Hitachi H8/300H
|
EM_H8S
|
0x30 |
Hitachi H8S
|
EM_H8_500
|
0x31 |
Hitachi H8/500
|
EM_IA_64
|
0x32 |
IA-64
|
EM_MIPS_X
|
0x33 |
Stanford MIPS-X
|
EM_COLDFIRE
|
0x34 |
Motorola ColdFire
|
EM_68HC12
|
0x35 |
Motorola M68HC12
|
EM_MMA
|
0x36 |
Fujitsu MMA Multimedia Accelerator
|
EM_PCP
|
0x37 |
Siemens PCP
|
EM_NCPU
|
0x38 |
Sony nCPU indlejret RISC-processor
|
EM_NDR1
|
0x39 |
Denso NDR1 mikroprocessor
|
EM_STARCORE
|
0x3A |
Motorola Star*Core-processor
|
EM_ME16
|
0x3B |
Toyota ME16 processor
|
EM_ST100
|
0x3C |
STMicroelectronics ST100 processor
|
EM_TINYJ
|
0x3D |
Advanced Logic Corp. TinyJ indlejret processorfamilie
|
EM_X86_64
|
0x3E
|
AMD x86-64
|
EM_MCST_ELBRUS
|
0xAF
|
Elbrus (processorarkitektur)
|
EM_TI_C6000
|
0x8C |
TMS320C6000 familie
|
EM_AARCH64
|
0xB7 |
ARM 64-bit (ARMv8/Aarch64)
|
EM_RISCV
|
0xF3 |
RISC-V
|
EM_BPF
|
0xF7 |
Berkeley pakkefilter
|
EM_65816
|
0x101
|
WDC 65C816
|
|
fire
|
e_version |
Formatér versionsnummer. I øjeblikket anses kun én værdi for at være korrekt.
Navn
|
Betyder
|
Beskrivelse
|
EV_NONE
|
0
|
Forkert værdi
|
EV_CURRENT
|
en
|
Nuværende version
|
|
fire
|
otte
|
e_entry |
Den virtuelle adresse på det indgangspunkt, som systemet sender kontrollen til, når processen starter. Hvis filen ikke har et indgangspunkt, indeholder dette felt 0.
|
fire
|
otte
|
e_phoff |
Forskydning af programhovedtabellen fra begyndelsen af filen, i bytes. Hvis filen ikke har en programoverskriftstabel, indeholder dette felt 0.
|
fire
|
otte
|
e_shoff |
Sektionsoverskriftstabel offset fra begyndelsen af filen, i bytes. Hvis filen ikke har en sektionsoverskriftstabel, indeholder dette felt 0.
|
fire
|
e_flags |
Processor-specifikke flag knyttet til filen . Hvis de er fraværende, indeholder dette felt 0.
|
2
|
e_ehsize |
Filhovedstørrelse i bytes ( 52for 32-bit og 6464-bit filer).
|
2
|
e_phentsize |
Størrelsen af en programoverskrift. Alle programoverskrifter har samme størrelse ( 32for 32-bit-filer og 56for 64-bit-filer).
|
2
|
e_phnum |
Antallet af programoverskrifter. Hvis filen ikke har en programoverskriftstabel, indeholder dette felt 0.
|
2
|
e_shentsize |
Størrelsen af en sektionsoverskrift. Alle sektionsoverskrifter har samme størrelse ( 40for 32-bit filer og 64for 64-bit).
|
2
|
e_shnum |
Antallet af sektionsoverskrifter. Hvis filen ikke har en sektionsoverskriftstabel, indeholder dette felt 0.
|
2
|
e_shstrndx |
Indekset for en post i sektionsoverskriftstabellen, der beskriver tabellen med sektionsnavne (normalt kaldes denne tabel .shstrtab og repræsenterer en separat sektion). Hvis filen ikke indeholder en sektionsnavnetabel, indeholder dette felt 0.
|
Programoverskriftstabel
Programhovedtabellen indeholder overskrifter, som hver beskriver et separat programsegment og dets attributter, eller anden information, der er nødvendig af operativsystemet for at forberede programmet til udførelse. Denne tabel kan placeres hvor som helst i filen, dens placering (offset i forhold til begyndelsen af filen) er beskrevet i e_phoffELF-header-feltet.
Når man analyserer programhovedstrukturen, kan man finde forskellige feltplaceringer p_flagsfor 32-bit og 64-bit ELF-filer. Denne forskel skyldes justeringen af strukturen for at øge forarbejdningseffektiviteten.
Programoverskriftsfelter
Størrelsen
|
Navn
|
Formål
|
NISSE
32
|
NISSE
64
|
fire
|
p_type
|
Den type segment, som denne overskrift beskriver, eller hvordan man fortolker feltværdierne for denne overskrift.
Navn
|
Betyder
|
Beskrivelse
|
PT_NULL
|
0
|
Titlen bruges ikke, resten af felterne er ikke defineret. Denne type giver dig mulighed for at inkludere ignorerede elementer i filens programoverskriftstabel.
|
PT_LOAD
|
en
|
Segmentet, der skal indlæses, beskrevet af felterne p_fileszog p_memsz. Bytene fra filen er knyttet til et segment i hukommelsen. Hvis hukommelsessegmentstørrelsen ( p_memsz) er større end filsegmentstørrelsen ( p_filesz), udfyldes de ekstra bytes med nuller (de følger umiddelbart efter de bytes, der er defineret i segmentet). Størrelsen af et segment i en fil ( p_filesz) kan ikke være større end størrelsen af et segment i hukommelsen ( p_memsz). Programtitlerne for de downloadbare segmenter er arrangeret i programtitler-tabellen i stigende rækkefølge efter feltets værdi p_vaddr.
|
PT_DYNAMIC
|
2
|
Programhovedet giver information om dynamiske links.
|
PT_INTERP
|
3
|
Programhovedet angiver størrelsen og placeringen af stien (nullterminerede C -stil strenge), der skal køre som en fortolker. Denne type segment er kun meningsfuld for eksekverbare filer (selvom det også kan være i en delt objektfil); det kan ikke forekomme mere end én gang i en fil. Hvis en header af denne type er til stede, skal den gå foran enhver programheader for det segment, der indlæses.
|
PT_NOTE
|
fire
|
Programhovedet definerer placeringen og størrelsen af hjælpeinformationen.
|
PT_SHLIB
|
5
|
Denne segmenttype er reserveret, men dens betydning er udefineret. Programmer, der indeholder en programheader af denne type, overholder ikke ABI.
|
PT_PHDR
|
6
|
Programheaderen, hvis den findes, angiver placeringen og størrelsen af selve programheader-tabellen, både i filen og i programmets hukommelsesbillede. Denne segmenttype kan ikke forekomme mere end én gang i en fil. Desuden kan det kun forekomme, hvis der er en programoverskriftstabel i filen. Hvis en header af denne type er til stede, skal den gå foran enhver programheader for det segment, der indlæses.
|
PT_TLS
|
7
|
Programhovedet definerer det tråd-lokale lagermønster. ELF-indlæsere må ikke opretholde denne post i programoverskriftstabellen.
|
PT_LOOS-PT_HIOS
|
1610612736 - 1879048191
|
Operativsystemafhængige værdier.
|
PT_LOPROC-PT_HIPROC
|
1879048192 - 2147483647
|
Processorafhængige værdier.
|
|
|
fire
|
p_flags
|
Segmentrelaterede flag (for ELF64).
Navn
|
Betyder
|
Beskrivelse
|
PF_X
|
0x1
|
Tilladelse til at udføre
|
PF_W
|
0x2
|
Skrivetilladelse
|
PF_R
|
0x4
|
Læsetilladelse
|
PF_MASKOS
|
0x0ff00000
|
Alle bits inkluderet i dette felt definerer operativsystemafhængige værdier.
|
PF_MASKPROC
|
0xf0000000
|
Alle bits inkluderet i dette felt definerer processorspecifikke værdier.
|
|
fire
|
otte
|
p_offset
|
Segmentforskydning fra begyndelsen af filen.
|
fire
|
otte
|
p_vaddr
|
Den virtuelle adresse på segmentet i hukommelsen, hvor segmentet skal indlæses, når det tilknyttes hukommelsen.
|
fire
|
otte
|
p_paddr
|
Segmentets fysiske adresse (for systemer, hvor det er vigtigt).
|
fire
|
otte
|
p_filesz
|
Segmentstørrelsen i filen. Kan være nul.
|
fire
|
otte
|
p_memsz
|
Størrelsen af segmentet i hukommelsen. Kan være nul.
|
fire
|
|
p_flags
|
Segmentrelaterede flag (for ELF32) (se ovenfor for mulige værdier).
|
fire
|
otte
|
p_align
|
Segmentjustering. 0og 1bestemme den manglende tilpasning. Ellers skal det være et positivt 2'er til en vis grad.
|
Sektionsoverskriftstabel
Sektionsoverskriftstabellen indeholder sektionsattributterne for filen. Denne tabel er kun nødvendig af linkeren, eksekverbare filer behøver ikke denne tabel (ELF-indlæseren ignorerer den). Oplysningerne i sektionsoverskriftstabellen bruges af linkeren til optimalt at arrangere disse sektioner i segmenter, når filen kompileres, under hensyntagen til deres attributter.
Sektionsoverskriftsfelter
Størrelsen
|
Navn
|
Formål
|
NISSE
32
|
NISSE
64
|
fire
|
sh_name
|
Forskydning af linjen, der indeholder navnet på denne sektion, i forhold til begyndelsen af tabellen med sektionsnavne.
|
fire
|
sh_type
|
Overskriftstype.
Navn
|
Betyder
|
Beskrivelse
|
SHT_NULL
|
0
|
Titlen bruges ikke, resten af felterne er ikke defineret.
|
SHT_PROGBITS
|
en
|
Afsnittet indeholder information defineret af programmet, dets format og betydning bestemmes af programmet alene.
|
SHT_SYMTAB
|
2
|
Afsnittet indeholder symboltabellen. Der kan kun være én sådan sektion i en fil i øjeblikket.
|
SHT_STRTAB
|
3
|
Afsnittet indeholder en tabel med strenge. En fil kan have mange sektioner af denne type.
|
SHT_RELA
|
fire
|
Afsnittet indeholder udvidet information om bevægelser. En fil kan have mange sektioner af denne type.
|
SHT_HASH
|
5
|
Sektionen indeholder en symbolhash-tabel. Der kan kun være én sådan sektion i en fil i øjeblikket.
|
SHT_DYNAMIC
|
6
|
Afsnittet indeholder information om dynamiske links. Der kan kun være én sådan sektion i en fil i øjeblikket.
|
SHT_NOTE
|
7
|
Afsnittet indeholder oplysninger, der markerer filen på en eller anden måde.
|
SHT_NOBITS
|
otte
|
Sektionen tager ingen plads i filen, ellers ligner den SHT_PROGBITS.
|
SHT_REL
|
9
|
Afsnittet indeholder information om bevægelser. En fil kan have mange sektioner af denne type.
|
SHT_SHLIB
|
ti
|
Denne sektionstype er defineret, men har ingen specifik betydning.
|
SHT_DYNSYM
|
elleve
|
Afsnittet indeholder symboltabellen. Der kan kun være én sådan sektion i en fil i øjeblikket.
|
SHT_INIT_ARRAY
|
fjorten
|
Afsnittet indeholder en række pointere til programinitieringsfunktionerne. Funktioner må ikke tage nogen argumenter og ikke returnere noget.
|
SHT_FINI_ARRAY
|
femten
|
Afsnittet indeholder en række henvisninger til programafslutningsfunktionerne. Funktioner må ikke tage nogen argumenter og ikke returnere noget.
|
SHT_PREINIT_ARRAY
|
16
|
Afsnittet indeholder en række pointere til funktioner, der kaldes, før programinitieringsfunktionerne kaldes. Funktioner må ikke tage nogen argumenter og ikke returnere noget.
|
SHT_GROUP
|
17
|
Dette afsnit definerer en gruppe af sektioner. En sektionsgruppe er en samling af relaterede sektioner, der skal håndteres på en særlig måde af linkeren. Sådanne sektioner kan kun være i objektfiler, der kan flyttes (hvis felt e_typehar værdien ET_REL). Overskriften, der definerer en gruppe af sektioner, skal være i sektionstabellen før overskrifterne for alle sektioner, der er inkluderet i gruppen, der defineres.
|
SHT_SYMTAB_SHNDX
|
atten
|
En sektion er knyttet til en symboltabel og er nødvendig, hvis et element i denne tabel refererer til en sektionsoverskrift, der har et indeks SHN_XINDEX(dette sker, hvis sektionsindekset er så stort, at det ikke passer i feltet st_shndx). Afsnittet indeholder en række numre af typen Elf32_Wordfor ELF32 og Elf64_Wordfor ELF64. Hvert element i dette array svarer til en indgang i symboltabellen og placeres i den tilsvarende rækkefølge. Disse elementer er indekser over de afsnitsoverskrifter, som de tilsvarende symboler er knyttet til. Hvis værdien af feltet for det st_shndxtilsvarende element i symboltabellen er SHN_XINDEX, indeholder elementet det reelle sektionsoverskriftsindeks, ellers indeholder elementet 0.
|
SHT_LOOS-SHT_HIOS
|
1610612736 - 1879048191
|
Operativsystemafhængige værdier.
|
SHT_LOPROC-SHT_HIPROC
|
1879048192 - 2147483647
|
Processorafhængige værdier.
|
SHT_LOUSER-SHT_HIUSER
|
2147483648 - 4294967295
|
Programafhængige værdier. Disse værdier kan bruges af filbehandlere i ELF-format uden konflikt med de aktuelt definerede værdier.
|
|
fire
|
otte
|
sh_flags
|
sektionsattributter.
Navn
|
Betyder
|
Beskrivelse
|
SHF_WRITE
|
0x1
|
Skrivetilladelse.
|
SHF_ALLOC
|
0x2
|
Sektionen optager hukommelse, mens processen kører. Nogle servicesektioner indlæses ikke i hukommelsen, når en objektfil indlæses; for sådanne sektioner er dette flag deaktiveret.
|
SHF_EXECINSTR
|
0x4
|
Afsnittet indeholder eksekverbare maskininstruktioner.
|
SHF_MERGE
|
0x10
|
Data i en partition kan kombineres for at eliminere duplikering. Hvis flaget SHF_STRINGSikke er sat, har dataelementerne i sektionen samme størrelse. Størrelsen af et element er angivet i feltet sh_entsize. Hvis flaget SHF_STRINGSer sat, består sektionen af arrays af nulterminerede tegn, og størrelsen på et tegn er angivet i feltet sh_entsize.
Hvert element i en sektion sammenlignes med andre elementer i sektioner med samme navn, type og flag. Elementer, der vil have samme værdi under programafviklingen, kan kombineres. Flytninger, der henviser til medlemmer af sådanne sektioner, skal løses i overensstemmelse hermed. Før fletning skal alle elementer i en sektion parses for at afgøre, om værdierne faktisk vil være identiske på kørselstidspunktet.
Denne forening er ikke et krav for overholdelse af ABI.
|
SHF_STRINGS
|
0x20
|
En sektion består af arrays af null-terminerede tegn. Størrelsen på et tegn er angivet i feltet sh_entsize.
|
SHF_INFO_LINK
|
0x40
|
Sektionsoverskriftsfeltet sh_infoindeholder indekset for sektionsoverskriftstabelposten.
|
SHF_LINK_ORDER
|
0x80
|
Særlige krav til placering. Kravene gælder, hvis sh_linkafsnitsoverskriftsfeltet refererer til et andet afsnit (relateret afsnit). Hvis det sh_linksammenkædede afsnitsfelt ikke indeholder 0, skal det aktuelle afsnit være i outputfilen i samme rækkefølge i forhold til det sammenkædede afsnit, som det sammenkædede afsnit er i forhold til det afsnit, det er knyttet til.
|
SHF_OS_NONCONFORMING
|
0x100
|
Afsnittet kræver speciel, operativsystemspecifik håndtering for at forhindre forkert opførsel.
|
SHF_GROUP
|
0x200
|
Sektion - et element (muligvis det eneste) i en gruppe af sektioner
|
SHF_TLS
|
0x400
|
Sektionen indeholder Thread-Local Storage, hver tråd vil have sin egen kopi af denne sektion.
|
SHF_COMPRESSED
|
0x800
|
Afsnittet indeholder komprimerede data. Dette flag gælder kun for sektioner, som der ikke er allokeret hukommelse til, når en objektfil indlæses i hukommelsen. Flaget bruges ikke i kombination med SHF_ALLOC. Dette flag gælder heller ikke for sektioner af typen SHT_NOBITS.
Alle bevægelser relateret til en komprimeret sektion refererer til dens data i ukomprimeret tilstand. Derfor er sektionsdekompression nødvendig for at tillade bevægelse. Hver komprimeret sektion definerer sin egen komprimeringsalgoritme. Det er acceptabelt, at forskellige sektioner i en ELF-objektfil bruger forskellige komprimeringsalgoritmer.
Komprimerede sektioner begynder med en overskrift, der identificerer komprimeringsalgoritmen.
Komprimerede sektionsoverskriftsfelter
Størrelsen
|
Navn
|
Formål
|
NISSE
32
|
NISSE
64
|
fire
|
fire
|
ch_type
|
kompressionsalgoritme.
Navn
|
Betyder
|
Beskrivelse
|
ELFCOMPRESS_ZLIB
|
en
|
Dataene i afsnittet komprimeres ved hjælp af Zlib -algoritmen . Komprimerede data følger umiddelbart efter overskriften og før slutningen af afsnittet.
|
ELFCOMPRESS_LOOS-ELFCOMPRESS_HIOS
|
1610612736 - 1879048191
|
Operativsystemafhængige værdier.
|
ELFCOMPRESS_LOPROC-ELFCOMPRESS_HIPROC
|
1879048192 - 2147483647
|
Processorafhængige værdier.
|
|
|
fire
|
ch_reserved
|
Reserveret til fremtidig brug.
|
fire
|
otte
|
ch_size
|
Størrelsen i bytes af den dekomprimerede sektion.
|
fire
|
otte
|
ch_addralign
|
Påkrævet justering for den dekomprimerede sektion.
|
|
SHF_MASKOS
|
0x0ff00000
|
Alle bits inkluderet i dette felt definerer operativsystemafhængige værdier.
|
SHF_MASKPROC
|
0xf0000000
|
Alle bits inkluderet i dette felt definerer processorspecifikke værdier.
|
|
fire
|
otte
|
sh_addr
|
Hvis sektionen skal indlæses i hukommelsen, når objektfilen indlæses, angiver dette felt adressen, hvorfra sektionen skal indlæses, ellers indeholder feltet 0.
|
fire
|
otte
|
sh_offset
|
Sektionsforskydning fra begyndelsen af filen i bytes. Typesektioner SHT_NOBITSoptager ikke plads i filen; for dem indeholder dette felt den konceptuelle placering i filen.
|
fire
|
otte
|
sh_size
|
Sektionsstørrelse i filen. Kan være nul.
|
fire
|
sh_link
|
Indekset for den tilknyttede sektion. Dette felt kan have forskellige formål afhængigt af headertypen.
Fortolkning af felter sh_linkog sh_infoafhængig af feltets værdish_type
sh_type
|
sh_link
|
sh_info
|
SHT_DYNAMIC
|
Indekset for strengtabelsektionsoverskriften, der bruges af elementerne i denne sektion.
|
0
|
SHT_HASH
|
Indeks for overskriften på symboltabelsektionen, som denne hash-tabel tilhører.
|
0
|
SHT_REL,SHT_RELA
|
Sektionsoverskriftsindekset for den tilknyttede symboltabel.
|
Sektionsoverskriftsindekset, som flyttedataene skal anvendes på.
|
SHT_SYMTAB,SHT_DYNSYM
|
Indeks for sektionsoverskriften for den tilknyttede strengtabel.
|
En mere end indekset for det sidste lokale symbol ( STB_LOCAL) i symboltabellen.
|
SHT_GROUP
|
Sektionsoverskriftsindekset for den tilknyttede symboltabel.
|
Indekset for elementet i den tilknyttede symboltabel. Navnet på det angivne element giver sektionsgruppens signatur.
|
SHT_SYMTAB_SHNDX
|
Sektionsoverskriftsindekset for den tilknyttede symboltabelsektion.
|
0
|
|
fire
|
sh_info
|
Yderligere information om afsnittet (se ovenfor for mulige værdier).
|
fire
|
otte
|
sh_addralign
|
Påkrævet sektionsopretning.
|
fire
|
otte
|
sh_entsize
|
Størrelsen i bytes af hver post (hvis sektionen indeholder en række af faste størrelsesposter, ellers indeholder feltet 0).
|
Indhold af sektioner og segmenter
Hjælpeprogrammer
Der er mange værktøjer til at arbejde med ELF-filer, de vigtigste er indeholdt i GNU Binutils- softwareværktøjssættet :
- elfedit - Ændring af ELF-filheader, en del af GNU Binutils-pakken.
- objdump - output information om objektfiler (inklusive ELF), en del af GNU Binutils sættet.
- readelf - Viser detaljerede oplysninger om en objektfil i ELF-formatet, en del af GNU Binutils-pakken.
- elfdump- Vis information om ELF-filen, en del af GNU Binutils-pakken.
- elfutilser et alternativ til GNU Binutils, officielt kun tilgængelig for GNU/Linux , men der er porte til andre operativsystemer [4] .
- file- output en lille mængde information om filer af formater kendt af programmet (tilgængelig for de fleste UNIX-lignende operativsystemer ).
Se også
Noter
- ↑ System V Application Binary Interface Arkiveret 21. maj 2015 på Wayback Machine Edition 4.1 (1997-03-18 )
- ↑ ELF-specifikation Arkiveret 16. juni 2012 på Wayback Machine
- ↑ ELF-64 Object File Format Arkiveret 1. juli 2015 på Wayback Machine
- ↑ FreshPorts -- devel/elfutils . www.freshports.org. Hentet 31. marts 2018. Arkiveret fra originalen 16. februar 2018. (ubestemt)
Links