Fra Learning Linux Binary Analysis af Ryan “elfmaster” O “Neill . På side 32 siger forfatteren,
Flytteregistreringerne for 32-bit ELF-filer er de samme som for 64-bit, men brug 32-bit heltal. Følgende eksempel på er objektfilkode vil blive kompileret som 32-bit, så vi kan demonstrere implicitte tilføjelser, som ikke er så almindeligt anvendte i 64-bit. En implicit addend opstår, når omplaceringsposter er gemt i
ElfN_Rel
typestrukturer, der ikke indeholder enr_addend
-feltet og derfor gemmes addend i selve flytningsmålet. 64-bit eksekverbare filer har tendens til at brugeElfN_Rela
structs, der indeholder en eksplicit addend . Jeg synes, det er værd at forstå begge scenarier, men implicitte tilføjelser er lidt mere forvirrende, så det giver mening at bringe lys til dette område.
Hvad er den egentlige definition af en “addend” ?
Kommentarer
- english.stackexchange.com/search?q=addend
- Addend + addend, minuend-subtrahend, multiplicand * multiplier, dividend / divisor
Svar
Jeg tror, det betyder bare “et tal, der” er tilføjet “, og i dette tilfælde” det nummer, som “er tilføjet til basisbelastningsadressen ( eller segmentbelastningsadresse) for at beregne den endelige markør til denne flytning “.
Lad os forestille os, at når vi indlæser vores binær i hukommelsen ved 0x400000, har vi en markør ved 0x401234, der peger på 0x405678. (Hvis i stedet vi indlæste binærfilen ved 0x800000, så dette skulle pege på 0x805678, derfor skal den flyttes.) Jeg kender ikke ELF, men min læsning af dette er, at
-
in t han implicit tilfældet, at flytningstabellen kun gemmer forskydninger i din binære, i dette tilfælde 0x1234, og i vores binære ved offset 0x1234 gemmer vi måloffset 0x5678. Derfor bliver omplacering
for hver adresse
A
i omplaceringstabellen*(base + A) += base
(Dette er hvordan flytningstabeller fungerer i PE-filer.)
-
i det eksplicitte tilfælde gemmer flytningstabellen både forskydningen i din binære og målforskydningen, dvs. 0x1234 0x5678. Så flytning her er
for hvert adressepar
A, B
i omplaceringstabellen*(base + A) = base + B
Jeg ved ikke, hvad der sker i binærfunktionen ved forskydning 0x1234 i dette tilfælde.
Svar
- Augend er et udtryk, der betyder et tal, der er underlagt tilføjelse
- Tilføjelse er det nummer, du vil tilføje.
Fra Dictionary.com ,
Har du nogensinde fundet dig selv at stirre på et stykke papir med“ 3 + 4 ”Skrev på det og spekulerede på,” hvad er det rette udtryk for hver af disse to respektive størrelser? ”Nej? Det første tal er augend og det nummer, der føjes til det, er addend.
Du kan se et diagram over andre matematiske termer her på Wikipedia “s ” Beregningsresultater “ ,
Hvorfor de særlige vilkår her?
- Nå, det er sandsynligvis fordi i samling
add rbi, rax
faktisk gemmer resultatet irbi
. Så at kende det første argument er ikke kun et argument tiladd
men destinationen;add rax, rbi
gemmer resultatet irax
. Hvis samling blev vist med operatorer i stedet, ville vi haverbi += rax
ograx += rbi
. - Fordi addend er ikke altid en offset, og augend er ikke altid basen. Selvom “offset” i dette specifikke eksempel er langt mere passende.
-
I dette specifikke tilfælde kan udtrykket “implicit offset” findes i Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification Version 1.2 ,
… kun
Elf32_Rela
poster indeholder en eksplicit tilføjelse. Indlæg af typenElf32_Rel
gem et implicit addend på det sted, der skal ændres. Afhængigt af processorarkitekturen kan den ene eller den anden form være nødvendig eller mere praktisk.Derfor kan en implementering til en bestemt maskine kun bruge en form eller en hvilken som helst form afhængigt af kontekst.
Svar
Tilføjelse er simpelthen “et tal, der skal tilføjes til en anden “, ifølge Merian Webster .
Kommentarer
- Det var allerede anført i det eksisterende svar. Du kan tilføje lidt mere til dit svar for at gøre det mere informativt.