Fra Learning Linux Binary Analysis av Ryan «elfmaster» O «Neill . På side 32 sier forfatteren,
Flyttingspostene for 32-bit ELF-filer er de samme som for 64-bit, men bruk 32-biters heltall. Følgende eksempel for er objektfilkode vil bli kompilert som 32-bit slik at vi kan demonstrere implisitte tillegg, som ikke er like vanlig i 64-bit. En implisitt tillegg oppstår når omplasseringsposter er lagret i
ElfN_Rel
typestrukturer som ikke inneholder enr_addend
-feltet, og derfor lagres tillegget i selve flyttemålet. 64-bit-kjørbare filer bruker en tendens til å brukeElfN_Rela
-strukturene som inneholder et eksplisitt tillegg . Jeg synes det er verdt å forstå begge scenariene, men implisitte tillegg er litt mer forvirrende, så det er fornuftig å bringe lys til dette området.
Hva er den faktiske definisjonen av et «addend» ?
Kommentarer
- english.stackexchange.com/search?q=addend
- Addend + addend, minuend-subtrahend, multiplicand * multiplier, dividend / divisor
Svar
Jeg tror det bare betyr «et tall som er lagt til», og i dette tilfellet «tallet som er lagt til grunnlastadressen ( eller segmentadressadresse) for å beregne den endelige pekeren for denne flyttingen «.
La oss forestille oss at når vi laster inn vårt binære minne i 0x400000, har vi en peker på 0x401234 som peker til 0x405678. (Hvis i stedet vi lastet binærbasen på 0x800000, så dette skal peke på 0x805678, derfor må den flyttes.) Jeg vet ikke ELF, men jeg leser dette er at
-
in t Han implisitt tilfeller flyttetabellen lagrer bare forskyvninger i binærfilen din, i dette tilfellet 0x1234, og i vår binære ved offset 0x1234 lagrer vi måloffset 0x5678. Derfor blir flytting
for hver adresse
A
i flyttetabellen*(base + A) += base
(Dette er hvordan omplasseringstabeller fungerer i PE-filer.)
-
i det eksplisitte tilfellet lagrer flyttetabellen både forskyvningen i din binære og måloffset, dvs. 0x1234 0x5678. Så flytting her er
for hvert adressepar
A, B
i flyttetabellen*(base + A) = base + B
Jeg vet ikke hva som går i binærfasen ved utligning 0x1234 i dette tilfellet.
Svar
- Augend er et begrep som betyr et tall som er underlagt tillegg
- Addend er tallet du skal legge til.
Fra Dictionary.com ,
Har du noen gang funnet at du stirrer på et papir med“ 3 + 4 ”Skrevet på den, og lurte på“ hva er riktig ord for hver av disse to respektive størrelsene? ”Nei? Det første tallet er augend og tallet som legges til er addend.
Du kan se et diagram over andre matematiske termer her på Wikipedia «s » Beregningsresultater « ,
Hvorfor spesielle vilkår her?
- Vel, det er sannsynlig fordi
add rbi, rax
faktisk vil lagre resultatet irbi
. Så å kjenne det første argumentet er ikke bare et argument tiladd
, men målet;add rax, rbi
lagrer resultatet irax
. Hvis montering ble vist med operatører i stedet, ville vi harbi += rax
ograx += rbi
. - Fordi addend er ikke alltid en forskyvning, og augend er ikke alltid basen. Selv om «offset» i dette spesifikke eksemplet er langt mer passende.
-
I dette spesifikke tilfellet kan begrepet «implisitt forskyvning» bli funnet i Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification Version 1.2 ,
… bare
Elf32_Rela
oppføringer inneholder et eksplisitt tillegg. Oppføringer av typenElf32_Rel
lagre et implisitt tillegg på stedet som skal endres. Avhengig av prosessorarkitekturen, kan det ene eller det andre skjemaet være nødvendig eller mer praktisk.Derfor kan en implementering for en bestemt maskin bruke ett skjema eksklusivt eller en eller annen form avhengig av kontekst.
Svar
Addend er ganske enkelt «et tall som skal legges til til en annen «, ifølge Merian Webster .
Kommentarer
- Det var allerede oppgitt i det eksisterende svaret. Du kan legge til litt mer i svaret ditt for å gjøre det mer informativt.