Körbart och länkbart format
Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från
versionen som granskades den 7 juni 2021; kontroller kräver
6 redigeringar .
ELF ( engelsk Executable and Linkable Format - körbart och länkbart filformat) är ett binärt filformat som används i många moderna UNIX-liknande operativsystem, som FreeBSD , Linux , Solaris , etc.
Historik
ELF-formatstandarden utvecklades och publicerades ursprungligen av som en del av UNIX System V binära applikationsgränssnitt [1] . Det valdes sedan ut av kommittén och utvecklades som ett bärbart format för olika operativsystem som körs på 32-bitars Intel x86-hårdvaruarkitekturen . [2] ELF blev snabbt populär och, efter att HP utökat formatet och publicerat ELF-64-standarden, spreds det till 64-bitarsplattformar. [3]
Typer
ELF-formatstandarden särskiljer flera typer av filer:
- Flyttbar fil – lagrar instruktioner och data som kan länkas till andra objektfiler . Resultatet av en sådan länk kan vara en delad objektfil eller en körbar fil. Denna typ inkluderar objektfiler för statiska bibliotek.
- Delad objektfil - innehåller även instruktioner och data och kan associeras med andra flyttbara filer och delade objektfiler, som ett resultat av vilket en ny objektfil kommer att skapas, eller när programmet startas för exekvering kan operativsystemet dynamiskt associera det med programmets körbara fil, som ett resultat som kommer att skapa en körbar bild av programmet. I det senare fallet talar vi om delade bibliotek.
- Körbar fil - innehåller en fullständig beskrivning som gör att systemet kan skapa en bild av processen . Inklusive: instruktioner, data, beskrivning av nödvändiga delade objektfiler och nödvändig symbolisk och felsökningsinformation.
Format
Varje ELF-fil består av följande delar:
Filhuvud
Filhuvudet (ELF Header) har en fast plats i början av filen och innehåller en allmän beskrivning av filstrukturen och dess huvudsakliga egenskaper, såsom: typ, formatversion, processorarkitektur , virtuell ingångsadress , storlekar och förskjutningar andra delar av filen. Rubriken är 52 byte för 32-bitars filer eller 64 för 64-bitars . Denna skillnad beror på att filhuvudet innehåller tre fält med en pekarestorlek, som är 4 och 8 byte för 32-bitars respektive 64-bitars processorer . Dessa fält är , och .
e_entrye_phoffe_shoff
ELF-filhuvudfält
Storleken
|
namn |
Ändamål
|
ÄLVA
32
|
ÄLVA
64
|
16
|
e_ident[16] |
Allmänna egenskaper hos filen.
Arraybytese_ident
Index
|
namn
|
Ändamål
|
0 - 3
|
EI_MAG0-EI_MAG3
|
Filsignatur: 0x7f 0x45 0x4c 0x46.
|
fyra
|
EI_CLASS
|
Objektfilklass.
namn
|
Menande
|
Beskrivning
|
ELFCLASSNONE
|
0
|
Felaktig klass
|
ELFCLASS32
|
ett
|
32-bitars objektfil
|
ELFCLASS64
|
2
|
64-bitars objektfil
|
|
5
|
EI_DATA
|
Processorberoende datakodningsmetod.
|
6
|
EI_VERSION
|
ELF-versionen av rubriken. För närvarande bör värdet på denna byte vara EV_CURRENT.
namn
|
Menande
|
EV_CURRENT
|
ett
|
|
7
|
EI_OSABI
|
Operativsystem eller ABI- specifika tillägg som används i filen. Vissa fält i andra ELF-filstrukturer har flaggor och fält vars betydelse beror på operativsystemet eller ABI; tolkningen av dessa fält bestäms av värdet på den givna byten. Om objektfilen inte använder tillägg, rekommenderas att denna byte sätts till 0. Om värdet för denna byte ligger i intervallet från 64till 255beror dess tolkning på värdet för e_machine ELF-huvudfältet. I detta intervall kan varje arkitektur definiera sin egen uppsättning värden.
namn
|
Menande
|
Beskrivning
|
ELFOSABI_NONE
|
0
|
UNIX System V ABI
|
ELFOSABI_HPUX
|
ett
|
HP-UX
|
ELFOSABI_NETBSD
|
2
|
NetBSD
|
ELFOSABI_GNU
|
3
|
Filen använder GNU ELF-tillägg ( GNU/Linux )
|
ELFOSABI_SOLARIS
|
6
|
Solaris
|
ELFOSABI_AIX
|
7
|
AIX
|
ELFOSABI_IRIX
|
åtta
|
IRIX
|
ELFOSABI_FREEBSD
|
9
|
FreeBSD
|
ELFOSABI_TRU64
|
tio
|
Tru64 UNIX
|
ELFOSABI_MODESTO
|
elva
|
Modesto
|
ELFOSABI_OPENBSD
|
12
|
OpenBSD
|
ELFOSABI_OPENVMS
|
13
|
openvms
|
ELFOSABI_NSK
|
fjorton
|
Non Stop Kernel
|
ELFOSABI_AROS
|
femton
|
Amiga Research OS
|
ELFOSABI_FENIXOS
|
16
|
fenixOS
|
ELFOSABI_CLOUDABI
|
17
|
CloudABI
|
ELFOSABI_OPENVOS
|
arton
|
ÖppnaVOS
|
|
64 - 255
|
Processorberoende värden
|
|
åtta
|
EI_ABIVERSION
|
ABI-version.
|
9
|
EI_PAD
|
T.n. utfyllnadsbytes (fyllning). Arrayelement reserverade för framtida användning e_ident. Installeras vanligtvis i 0. Objektfilläsare bör ignorera dem.
|
tio
|
EI_PAD + 1
|
elva
|
EI_PAD + 2
|
12
|
EI_PAD + 3
|
13
|
EI_PAD + 4
|
fjorton
|
EI_PAD + 5
|
femton
|
EI_PAD + 6
|
|
2
|
e_type |
Filtyp.
namn
|
Menande
|
Beskrivning
|
ET_NONE
|
0
|
Osäker
|
ET_REL
|
ett
|
Filen flyttas
|
ET_EXEC
|
2
|
Körbar
|
ET_DYN
|
3
|
Fil med delat objekt
|
ET_CORE
|
fyra
|
kärnfil
|
ET_LOOS-ET_HIOS
|
65024 - 65279
|
Operativsystemberoende värden
|
ET_LOPROC-ET_HIPROC
|
65280 - 65535
|
Processorberoende värden
|
|
2
|
e_machine |
Arkitekturen för hårdvaruplattformen som filen skapades för:
namn
|
Menande
|
Beskrivning
|
EM_NONE
|
0x0
|
Odefinierad
|
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 |
Reserverad för framtida bruk
|
EM_PARISC
|
0x0F |
Hewlett-Packard PA-RISC
|
|
0x10 |
Reserverad för framtida bruk
|
EM_960
|
0x13 |
Intel 80960
|
EM_PPC
|
0x14
|
PowerPC
|
EM_PPC64
|
0x15
|
PowerPC (64-bitars)
|
EM_S390
|
0x16 |
S390 , inklusive S390x
|
EM_SPU
|
0x17 |
IBM SPU/SPC
|
|
0x18 - 0x23 |
Reserverad för framtida bruk
|
EM_V800
|
0x24 |
NEC V800
|
EM_FR20
|
0x25 |
Fujitsu FR20
|
EM_RH32
|
0x26 |
TRW RH-32
|
EM_MCOREochEM_RCE
|
0x27 |
Motorola RCE
|
EM_ARM
|
0x28 |
ARM (upp till ARMv7/Aarch32)
|
EM_OLD_ALPHA
|
0x29 |
Digital alfa
|
EM_SH
|
0x2A |
superh
|
EM_SPARCV9
|
0x2B |
SPARC version 9
|
EM_TRICORE
|
0x2C |
Siemens TriCore inbyggd 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 inbyggd 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 inbäddad processorfamilj
|
EM_X86_64
|
0x3E
|
AMD x86-64
|
EM_MCST_ELBRUS
|
0xAF
|
Elbrus (processorarkitektur)
|
EM_TI_C6000
|
0x8C |
TMS320C6000 familj
|
EM_AARCH64
|
0xB7 |
ARM 64-bitar (ARMv8/Aarch64)
|
EM_RISCV
|
0xF3 |
RISC-V
|
EM_BPF
|
0xF7 |
Berkeley paketfilter
|
EM_65816
|
0x101
|
WDC 65C816
|
|
fyra
|
e_version |
Formatera versionsnummer. För närvarande anses endast ett värde vara korrekt.
namn
|
Menande
|
Beskrivning
|
EV_NONE
|
0
|
Felaktigt värde
|
EV_CURRENT
|
ett
|
Aktuell version
|
|
fyra
|
åtta
|
e_entry |
Den virtuella adressen till ingångspunkten till vilken systemet skickar kontrollen när processen startar. Om filen inte har en ingångspunkt innehåller det här fältet 0.
|
fyra
|
åtta
|
e_phoff |
Offset av programhuvudtabellen från början av filen, i byte. Om filen inte har en programhuvudtabell innehåller detta fält 0.
|
fyra
|
åtta
|
e_shoff |
Sektionshuvudtabell förskjuten från början av filen, i byte. Om filen inte har en sektionsrubriktabell innehåller det här fältet 0.
|
fyra
|
e_flags |
Processorspecifika flaggor associerade med filen . Om de saknas innehåller detta fält 0.
|
2
|
e_ehsize |
Filrubrikstorlek i byte ( 52för 32-bitars och 6464-bitars filer).
|
2
|
e_phentsize |
Storleken på en programhuvud. Alla programhuvuden har samma storlek ( 32för 32-bitarsfiler och 56för 64-bitarsfiler).
|
2
|
e_phnum |
Antalet programrubriker. Om filen inte har en programhuvudtabell innehåller detta fält 0.
|
2
|
e_shentsize |
Storleken på en sektionsrubrik. Alla avsnittsrubriker har samma storlek ( 40för 32-bitarsfiler och 64för 64-bitars).
|
2
|
e_shnum |
Antalet avsnittsrubriker. Om filen inte har en sektionsrubriktabell innehåller det här fältet 0.
|
2
|
e_shstrndx |
Indexet för en post i sektionsrubriktabellen som beskriver tabellen med sektionsnamn (vanligtvis kallas den här tabellen .shstrtab och representerar en separat sektion). Om filen inte innehåller en sektionsnamntabell innehåller det här fältet 0.
|
Programhuvudtabell
Programhuvudtabellen innehåller rubriker, som var och en beskriver ett separat programsegment och dess attribut, eller annan information som behövs av operativsystemet för att förbereda programmet för exekvering. Denna tabell kan placeras var som helst i filen, dess plats (offset i förhållande till början av filen) beskrivs i e_phoffELF-rubrikfältet.
När man analyserar programhuvudstrukturen kan man hitta olika fältplatser p_flagsför 32-bitars och 64-bitars ELF-filer. Denna skillnad beror på inriktningen av strukturen för att öka bearbetningseffektiviteten.
Programhuvudfält
Storleken
|
namn
|
Ändamål
|
ÄLVA
32
|
ÄLVA
64
|
fyra
|
p_type
|
Typen av segment som denna rubrik beskriver, eller hur man tolkar fältvärdena för denna rubrik.
namn
|
Menande
|
Beskrivning
|
PT_NULL
|
0
|
Titeln används inte, resten av fälten är inte definierade. Den här typen låter dig inkludera ignorerade element i filens programhuvudtabell.
|
PT_LOAD
|
ett
|
Segmentet som ska laddas, beskrivs av fälten p_fileszoch p_memsz. Byten från filen mappas till ett segment i minnet. Om minnessegmentstorleken ( p_memsz) är större än filsegmentstorleken ( p_filesz), utfylls de extra byten med nollor (de följer omedelbart de byte som definieras i segmentet). Storleken på ett segment i en fil ( p_filesz) kan inte vara större än storleken på ett segment i minnet ( p_memsz). Programtitlarna för de nedladdningsbara segmenten är ordnade i programtitlartabellen i stigande ordning efter fältets värde p_vaddr.
|
PT_DYNAMIC
|
2
|
Programhuvudet ger information om dynamisk länkning.
|
PT_INTERP
|
3
|
Programhuvudet anger storleken och platsen för sökvägen (nollterminerade C - stilsträngar) som ska köras som tolk. Den här typen av segment är bara meningsfull för körbara filer (även om det också kan vara i en delad objektfil); det kan inte förekomma mer än en gång i en fil. Om en rubrik av denna typ finns, måste den föregå varje programhuvud för segmentet som laddas.
|
PT_NOTE
|
fyra
|
Programhuvudet definierar platsen och storleken på hjälpinformationen.
|
PT_SHLIB
|
5
|
Denna segmenttyp är reserverad, men dess betydelse är odefinierad. Program som innehåller en programhuvud av denna typ överensstämmer inte med ABI.
|
PT_PHDR
|
6
|
Programhuvudet, om det finns, anger platsen och storleken på själva programhuvudtabellen, både i filen och i programmets minnesbild. Denna segmenttyp kan inte förekomma mer än en gång i en fil. Dessutom kan det bara inträffa om det finns en programhuvudtabell i filen. Om en rubrik av denna typ finns, måste den föregå varje programhuvud för segmentet som laddas.
|
PT_TLS
|
7
|
Programhuvudet definierar mönstret för trådlokal lagring. ELF-lastare får inte behålla denna post i programhuvudtabellen.
|
PT_LOOS-PT_HIOS
|
1610612736 - 1879048191
|
Operativsystemberoende värden.
|
PT_LOPROC-PT_HIPROC
|
1879048192 - 2147483647
|
Processorberoende värden.
|
|
|
fyra
|
p_flags
|
Segmentrelaterade flaggor (för ELF64).
namn
|
Menande
|
Beskrivning
|
PF_X
|
0x1
|
Tillstånd att utföra
|
PF_W
|
0x2
|
Skrivtillstånd
|
PF_R
|
0x4
|
Lästillstånd
|
PF_MASKOS
|
0x0ff00000
|
Alla bitar som ingår i detta fält definierar operativsystemberoende värden.
|
PF_MASKPROC
|
0xf0000000
|
Alla bitar som ingår i detta fält definierar processorspecifika värden.
|
|
fyra
|
åtta
|
p_offset
|
Segmentoffset från början av filen.
|
fyra
|
åtta
|
p_vaddr
|
Den virtuella adressen för segmentet i minnet där segmentet ska laddas när det mappas till minnet.
|
fyra
|
åtta
|
p_paddr
|
Den fysiska adressen för segmentet (för system där det är viktigt).
|
fyra
|
åtta
|
p_filesz
|
Segmentstorleken i filen. Kan vara null.
|
fyra
|
åtta
|
p_memsz
|
Storleken på segmentet i minnet. Kan vara null.
|
fyra
|
|
p_flags
|
Segmentrelaterade flaggor (för ELF32) (se ovan för möjliga värden).
|
fyra
|
åtta
|
p_align
|
Segmentinriktning. 0och 1avgöra bristen på anpassning. Annars måste det vara en positiv 2 till en viss grad.
|
Sektionsrubriktabell
Sektionsrubriktabellen innehåller sektionsattributen för filen. Denna tabell behövs endast av länken, körbara filer behöver inte denna tabell (ELF-laddaren ignorerar den). Informationen som ges i sektionsrubriktabellen används av länkaren för att optimalt ordna dessa sektioner i segment när filen kompileras, med hänsyn till deras attribut.
Sektionsrubrikfält
Storleken
|
namn
|
Ändamål
|
ÄLVA
32
|
ÄLVA
64
|
fyra
|
sh_name
|
Förskjutning av raden som innehåller namnet på denna sektion, i förhållande till början av tabellen med sektionsnamn.
|
fyra
|
sh_type
|
Typ av rubrik.
namn
|
Menande
|
Beskrivning
|
SHT_NULL
|
0
|
Titeln används inte, resten av fälten är inte definierade.
|
SHT_PROGBITS
|
ett
|
Avsnittet innehåller information som definieras av programmet, dess format och betydelse bestäms av programmet enbart.
|
SHT_SYMTAB
|
2
|
Avsnittet innehåller symboltabellen. Det kan bara finnas ett sådant avsnitt i en fil för tillfället.
|
SHT_STRTAB
|
3
|
Avsnittet innehåller en tabell med strängar. En fil kan ha många sektioner av denna typ.
|
SHT_RELA
|
fyra
|
Avsnittet innehåller utökad information om rörelser. En fil kan ha många sektioner av denna typ.
|
SHT_HASH
|
5
|
Avsnittet innehåller en symbolhashtabell. Det kan bara finnas ett sådant avsnitt i en fil för tillfället.
|
SHT_DYNAMIC
|
6
|
Avsnittet innehåller information om dynamisk länkning. Det kan bara finnas ett sådant avsnitt i en fil för tillfället.
|
SHT_NOTE
|
7
|
Avsnittet innehåller information som markerar filen på något sätt.
|
SHT_NOBITS
|
åtta
|
Avsnittet tar inget utrymme i filen, annars liknar det SHT_PROGBITS.
|
SHT_REL
|
9
|
Avsnittet innehåller information om rörelser. En fil kan ha många sektioner av denna typ.
|
SHT_SHLIB
|
tio
|
Denna sektionstyp är definierad, men har ingen specifik betydelse.
|
SHT_DYNSYM
|
elva
|
Avsnittet innehåller symboltabellen. Det kan bara finnas ett sådant avsnitt i en fil för tillfället.
|
SHT_INIT_ARRAY
|
fjorton
|
Avsnittet innehåller en rad pekare till programinitieringsfunktionerna. Funktioner får inte ta några argument och inte returnera något.
|
SHT_FINI_ARRAY
|
femton
|
Avsnittet innehåller en rad hänvisningar till programavslutningsfunktionerna. Funktioner får inte ta några argument och inte returnera något.
|
SHT_PREINIT_ARRAY
|
16
|
Avsnittet innehåller en uppsättning pekare till funktioner som anropas innan programinitieringsfunktionerna anropas. Funktioner får inte ta några argument och inte returnera något.
|
SHT_GROUP
|
17
|
Detta avsnitt definierar en grupp av avsnitt. En sektionsgrupp är en samling relaterade sektioner som måste hanteras på ett speciellt sätt av länken. Sådana avsnitt kan bara finnas i flyttbara objektfiler (vars fält e_typehar värdet ET_REL). Rubriken som definierar en grupp av avsnitt måste finnas i avsnittstabellen innan rubrikerna för alla avsnitt som ingår i gruppen definieras.
|
SHT_SYMTAB_SHNDX
|
arton
|
En sektion är associerad med en symboltabell och är nödvändig om något element i denna tabell refererar till en sektionsrubrik som har ett index SHN_XINDEX(detta händer om sektionsindexet är så stort att det inte får plats i fältet st_shndx). Avsnittet innehåller en rad nummer av typen Elf32_Wordför ELF32 och Elf64_Wordför ELF64. Varje element i denna array motsvarar en post i symboltabellen och placeras i motsvarande ordning. Dessa element är index över avsnittsrubriker till vilka motsvarande symboler är associerade. Om värdet på fältet för st_shndxmotsvarande element i symboltabellen är SHN_XINDEX, innehåller elementet det verkliga sektionsrubrikindexet, annars innehåller elementet 0.
|
SHT_LOOS-SHT_HIOS
|
1610612736 - 1879048191
|
Operativsystemberoende värden.
|
SHT_LOPROC-SHT_HIPROC
|
1879048192 - 2147483647
|
Processorberoende värden.
|
SHT_LOUSER-SHT_HIUSER
|
2147483648 - 4294967295
|
Programberoende värden. Dessa värden kan användas av filhanterare i ELF-format utan konflikt med de för närvarande definierade värdena.
|
|
fyra
|
åtta
|
sh_flags
|
avsnittsattribut.
namn
|
Menande
|
Beskrivning
|
SHF_WRITE
|
0x1
|
Skrivtillstånd.
|
SHF_ALLOC
|
0x2
|
Avsnittet tar upp minne medan processen körs. Vissa tjänstesektioner laddas inte in i minnet när en objektfil laddas; för sådana sektioner är denna flagga inaktiverad.
|
SHF_EXECINSTR
|
0x4
|
Avsnittet innehåller körbara maskininstruktioner.
|
SHF_MERGE
|
0x10
|
Data i en partition kan kombineras för att eliminera dubbelarbete. Om flaggan SHF_STRINGSinte är inställd har dataelementen i sektionen samma storlek. Storleken på ett element anges i fältet sh_entsize. Om flaggan SHF_STRINGSär inställd består sektionen av arrayer med nollterminerade tecken och storleken på ett tecken anges i fältet sh_entsize.
Varje element i en sektion jämförs med andra element i sektioner med samma namn, typ och flaggor. Element som kommer att ha samma värde under programkörning kan kombineras. Flyttningar som hänvisar till medlemmar i sådana sektioner måste lösas i enlighet med detta. Innan sammanslagning måste alla element i en sektion analyseras för att avgöra om värdena kommer att vara identiska under körning.
Denna förening är inte ett krav för efterlevnad av ABI.
|
SHF_STRINGS
|
0x20
|
En sektion består av arrayer av nollterminerade tecken. Storleken på ett tecken anges i fältet sh_entsize.
|
SHF_INFO_LINK
|
0x40
|
Sektionsrubrikfältet sh_infoinnehåller indexet för sektionsrubriktabellposten.
|
SHF_LINK_ORDER
|
0x80
|
Särskilda platskrav. Kraven gäller om sh_linkavsnittsrubrikfältet hänvisar till ett annat avsnitt (relaterat avsnitt). Om det sh_linklänkade avsnittsfältet inte innehåller 0måste det aktuella avsnittet finnas i utdatafilen i samma ordning i förhållande till det länkade avsnittet som det länkade avsnittet är i förhållande till avsnittet som det är länkat till.
|
SHF_OS_NONCONFORMING
|
0x100
|
Avsnittet kräver speciell, operativsystemspecifik hantering för att förhindra felaktigt beteende.
|
SHF_GROUP
|
0x200
|
Sektion - ett element (möjligen det enda) i en grupp av sektioner
|
SHF_TLS
|
0x400
|
Avsnittet innehåller trådlokal lagring, varje tråd kommer att ha sin egen kopia av detta avsnitt.
|
SHF_COMPRESSED
|
0x800
|
Avsnittet innehåller komprimerad data. Denna flagga gäller endast för sektioner för vilka minne inte allokeras när en objektfil laddas in i minnet. Flaggan används inte i kombination med SHF_ALLOC. Denna flagga gäller inte heller för sektioner av typ SHT_NOBITS.
Alla rörelser relaterade till en komprimerad sektion refererar till dess data i okomprimerat tillstånd. Därför är sektionsdekompression nödvändig för att tillåta rörelse. Varje komprimerad sektion definierar sin egen komprimeringsalgoritm. Det är acceptabelt att olika sektioner i en ELF-objektfil använder olika komprimeringsalgoritmer.
Komprimerade sektioner börjar med en rubrik som identifierar komprimeringsalgoritmen.
Komprimerade avsnittsrubrikfält
Storleken
|
namn
|
Ändamål
|
ÄLVA
32
|
ÄLVA
64
|
fyra
|
fyra
|
ch_type
|
komprimeringsalgoritm.
namn
|
Menande
|
Beskrivning
|
ELFCOMPRESS_ZLIB
|
ett
|
Data i avsnittet komprimeras med Zlib- algoritmen . Komprimerad data följer omedelbart efter rubriken och före slutet av avsnittet.
|
ELFCOMPRESS_LOOS-ELFCOMPRESS_HIOS
|
1610612736 - 1879048191
|
Operativsystemberoende värden.
|
ELFCOMPRESS_LOPROC-ELFCOMPRESS_HIPROC
|
1879048192 - 2147483647
|
Processorberoende värden.
|
|
|
fyra
|
ch_reserved
|
Reserverad för framtida bruk.
|
fyra
|
åtta
|
ch_size
|
Storleken i byte för den dekomprimerade sektionen.
|
fyra
|
åtta
|
ch_addralign
|
Krävs inriktning för den dekomprimerade sektionen.
|
|
SHF_MASKOS
|
0x0ff00000
|
Alla bitar som ingår i detta fält definierar operativsystemberoende värden.
|
SHF_MASKPROC
|
0xf0000000
|
Alla bitar som ingår i detta fält definierar processorspecifika värden.
|
|
fyra
|
åtta
|
sh_addr
|
Om sektionen ska laddas in i minnet när objektfilen laddas, anger detta fält adressen från vilken sektionen ska laddas, annars innehåller fältet 0.
|
fyra
|
åtta
|
sh_offset
|
Sektionsförskjutning från början av filen i byte. Typavsnitt SHT_NOBITStar inte upp plats i filen, för dem innehåller detta fält den begreppsmässiga platsen i filen.
|
fyra
|
åtta
|
sh_size
|
Sektionsstorlek i filen. Kan vara null.
|
fyra
|
sh_link
|
Indexet för det associerade avsnittet. Detta fält kan ha olika syften beroende på rubriktyp.
Tolkning av fält sh_linkoch sh_infoberoende på fältets värdesh_type
sh_type
|
sh_link
|
sh_info
|
SHT_DYNAMIC
|
Indexet för strängtabellssektionshuvudet som används av elementen i det här avsnittet.
|
0
|
SHT_HASH
|
Index för rubriken för symboltabellsektionen som denna hashtabell tillhör.
|
0
|
SHT_REL,SHT_RELA
|
Sektionshuvudindex för den tillhörande symboltabellen.
|
Sektionsrubrikindex som flyttuppgifterna ska tillämpas på.
|
SHT_SYMTAB,SHT_DYNSYM
|
Index för sektionshuvudet för den tillhörande strängtabellen.
|
En mer än indexet för den sista lokala symbolen ( STB_LOCAL) i symboltabellen.
|
SHT_GROUP
|
Sektionshuvudindex för den tillhörande symboltabellen.
|
Indexet för elementet i den tillhörande symboltabellen. Namnet på det angivna elementet ger sektionsgruppens signatur.
|
SHT_SYMTAB_SHNDX
|
Sektionsrubrikindex för den tillhörande symboltabellsektionen.
|
0
|
|
fyra
|
sh_info
|
Ytterligare information om avsnittet (se ovan för möjliga värden).
|
fyra
|
åtta
|
sh_addralign
|
Erforderlig sektionsinriktning.
|
fyra
|
åtta
|
sh_entsize
|
Storleken i byte för varje post (om avsnittet innehåller en array av poster med fast storlek, annars innehåller fältet 0).
|
Innehåll i avsnitt och segment
Utilities
Det finns många verktyg för att arbeta med ELF-filer, de viktigaste finns i GNU Binutils mjukvaruverktygssats :
- elfedit - Ändring av ELF-filhuvud, en del av GNU Binutils-sviten.
- objdump - mata ut information om objektfiler (inklusive ELF), en del av GNU Binutils-uppsättningen.
- readelf - Visar detaljerad information om en objektfil i ELF-formatet, en del av GNU Binutils-sviten.
- elfdump- visa information om ELF-filen, en del av GNU Binutils-sviten.
- elfutilsär ett alternativ för GNU Binutils, officiellt endast tillgängligt för GNU/Linux , men det finns portar till andra operativsystem [4] .
- file- mata ut en liten mängd information om filer med format som programmet känner till (tillgängligt för de flesta UNIX-liknande operativsystem ).
Se även
Anteckningar
- ↑ System V Application Binary Interface Arkiverad 21 maj 2015 på Wayback Machine Edition 4.1 (1997-03-18 )
- ↑ ELF-specifikation Arkiverad 16 juni 2012 på Wayback Machine
- ↑ ELF-64 Object File Format Arkiverad 1 juli 2015 på Wayback Machine
- ↑ FreshPorts -- devel/elfutils . www.freshports.org. Hämtad 31 mars 2018. Arkiverad från originalet 16 februari 2018. (obestämd)
Länkar