Hvad er en “ tilføjelse ”?

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 en r_addend -feltet og derfor gemmes addend i selve flytningsmålet. 64-bit eksekverbare filer har tendens til at bruge ElfN_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

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 “ ,

Beregningsresultater

Hvorfor de særlige vilkår her?

  • Nå, det er sandsynligvis fordi i samling add rbi, rax faktisk gemmer resultatet i rbi. Så at kende det første argument er ikke kun et argument til add men destinationen; add rax, rbi gemmer resultatet i rax. Hvis samling blev vist med operatorer i stedet, ville vi have rbi += rax og rax += 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 typen Elf32_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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *