Lähettäjä Linuxin binaarianalyysin oppiminen , kirjoittanut Ryan ”elfmaster” O ”Neill . Kirjoittaja ilmoittaa sivulla 32
32-bittisten ELF-tiedostojen siirtotietueet ovat samat kuin 64-bittisten, mutta käytä 32-bittisiä kokonaislukuja. Seuraava esimerkki objektitiedostokoodista kootaan 32-bittiseksi, jotta voimme osoittaa implisiittisiä lisäyksiä, joita ei käytetä niin yleisesti 64-bittisissä. implisiittinen lisäys tapahtuu, kun siirtotietueet on tallennettu
ElfN_Rel
-tyyppisiin rakenteisiin, jotka eivät sisällär_addend
-kenttä ja siksi lisäys tallennetaan itse siirtotavoitteeseen. 64-bittiset suoritettavat tiedostot käyttävät yleensäElfN_Rela
-rakenteita, jotka sisältävät nimenomaisen lisäyksen . Mielestäni on syytä ymmärtää molemmat skenaariot, mutta implisiittiset lisäykset ovat hieman hämmentävämpiä, joten on järkevää tuoda valoa tälle alueelle.
Mikä on ”lisäyksen” todellinen määritelmä?
Kommentit
- finnish.stackexchange.com/search?q=addend
- addend + addend, minuend-subtrahend, multiplicand * multiplier, dividend / divisor
Vastaa
Luulen, että se tarkoittaa vain ”numeroa, joka on lisätty”, ja tässä tapauksessa ”numeroa, joka lisätään peruskuormitusosoitteeseen ( tai segmenttikuormitusosoite) laskeaksesi tämän siirtämisen viimeisen osoittimen ”.
Kuvitellaan, että kun lataamme binaarimme muistiin 0x400000, meillä on osoitin 0x401234, joka osoittaa kohtaan 0x405678. (Jos sen sijaan ladasimme binaarin arvoon 0x800000, niin tämän pitäisi osoittaa 0x805678, joten se tarvitsee uudelleensijoittamista.) En tiedä ELF: ää, mutta luin tästä, että
-
in t hän viittaa implisiittiseen tapaukseen, jolloin siirtotaulukko tallentaa juuri offsetit binaariin, tässä tapauksessa 0x1234, ja binäärissämme offsetissa 0x1234 tallennamme kohdesiirteen 0x5678. Siksi siirtämisestä tulee
jokaiselle osoitteelle
A
siirtotaulukossa*(base + A) += base
(Tämä on se, miten siirtotaulukot toimivat PE-tiedostoissa.)
-
nimenomaisessa tapauksessa siirtotaulukko tallentaa sekä siirtymän binaariin että kohdesiirtoon, eli 0x1234 0x5678. Joten tässä on
jokainen osoitepari
A, B
siirtotaulukossa*(base + A) = base + B
En tiedä mitä binäärissä tapahtuu tässä tapauksessa siirtymässä 0x1234.
Vastaa
- Augend on termi, joka tarkoittaa numeroa, joka on lisättävä
- Lisää on numero, jonka lisäät.
Alkaen Dictionary.com ,
Oletko koskaan löytänyt itsesi tuijottavan paperia, jossa on“ 3 + 4 ” ”Kirjoitettu siihen ja miettinyt, mikä on oikea termi kullekin näistä vastaavista määristä? Ei? Ensimmäinen numero on augend ja siihen lisätty numero on lisäys.
Voit nähdä kaavion muista matematiikkatermeistä täältä Wikipedia ”s ” Laskentatulokset ” ,
Miksi tässä olevat erityisehdot?
- No, se on todennäköistä, koska kokoonpanossa
add rbi, rax
todella tallentaa tuloksen kansioonrbi
. Joten ensimmäisen argumentin tunteminen ei ole vain argumenttiadd
: lle, vaan kohteelle;add rax, rbi
tallentaa tuloksen tiedostoonrax
. Jos kokoonpano näytettiin sen sijaan operaattoreiden kanssa, meillä ”d onrbi += rax
jarax += rbi
. - Koska addend ei ole aina offset, eikä korotus ole aina perusta. Vaikka tässä erityisessä esimerkissä ”offset” on paljon sopivampi.
-
Tässä erityistapauksessa termi ”implisiittinen offset” löytyy Tool Interface Standard (TIS) Suoritettava ja linkittävä muoto (ELF) -määrityksen versiosta 1.2 ,
… vain
Elf32_Rela
-merkinnät sisältävät nimenomaisen lisäyksen. TyypitElf32_Rel
tallenna implisiittinen lisäys muokattavaan sijaintiin. Suorittimen arkkitehtuurista riippuen yksi tai toinen muoto voi olla tarpeen tai helpompaa.Näin ollen tietyn koneen toteutus voi käyttää vain yhtä muotoa tai kumpaakin muotoa kontekstista riippuen.
Vastaa
Lisää on yksinkertaisesti ”lisättävä numero toiselle ”, Merian Websterin mukaan .
Kommentit
- Se oli jo olemassa olevassa vastauksessa. Voit lisätä vastaukseesi hieman enemmän, jotta se olisi informatiivisempi.