De la Learning Linux Binary Analysis de Ryan „elfmaster” O „Neill . Pe pagina 32, autorul afirmă,
Înregistrările de relocare pentru fișierele ELF pe 32 de biți sunt aceleași ca pentru 64 de biți, dar utilizați numere întregi de 32 de biți. Următorul exemplu pentru codul fișierului obiect va fi compilat ca 32 de biți, astfel încât să putem demonstra completări implicite, care nu sunt la fel de frecvent utilizate în 64 de biți. Un addit implicit apare atunci când înregistrările de relocare sunt stocate în structuri de tip
ElfN_Rel
care nu conțin unr_addend
și, prin urmare, suplimentul este stocat în ținta de relocare în sine. Executabilele pe 64 de biți tind să folosească structurileElfN_Rela
care conțin un addend explicit . Cred că merită să înțelegem ambele scenarii, dar completările implicite sunt puțin mai confuze, așa că are sens să aducem lumină în acest domeniu.
Ce este definiția reală a unui „addend” ?
Comentarii
- english.stackexchange.com/search?q=addend
- Addend + addend, minuend-subtrahend, multiplicand * multiplicator, dividend / divisor
Răspuns
Cred că înseamnă doar „un număr care a fost adăugat” și, în acest caz, „numărul care a fost adăugat la adresa de încărcare de bază ( sau adresa de încărcare a segmentului) pentru a calcula indicatorul final pentru această relocare „.
Să ne imaginăm că atunci când încărcăm binele în memorie la 0x400000 avem un indicator la 0x401234 care indică 0x405678. (Dacă în schimb am încărcat binarul la 0x800000, atunci acesta ar trebui să indice 0x805678, deci trebuie să se mute.) Nu știu ELF, dar citirea mea este că
-
în t În cazul implicit, tabela de relocare stochează doar compensări în binarul dvs., în acest caz 0x1234, iar în binarul nostru la offset 0x1234 stocăm offsetul țintă 0x5678. Prin urmare, relocarea devine
pentru fiecare adresă
A
în tabelul de relocare*(base + A) += base
funcționează tabelele de relocare în fișierele PE.)
-
în cazul explicit, tabela de relocare stochează atât offset-ul în binarul dvs., cât și offset-ul țintă, adică 0x1234 0x5678. Deci, relocarea aici este
pentru fiecare pereche de adrese
A, B
în tabelul de relocare*(base + A) = base + B
Nu știu ce se întâmplă în binar la offset 0x1234 în acest caz.
Răspuns
- Augend este un termen care înseamnă un număr care poate fi adăugat
- Addend este numărul pe care îl veți adăuga.
De la Dictionary.com ,
Te-ai trezit vreodată cu ochii pe o bucată de hârtie cu„ 3 + 4 ”Scris pe el și ne-am întrebat„ care este termenul potrivit pentru fiecare dintre aceste două cantități respective? ”Nu? Primul număr este augend și numărul care i se adaugă este addend.
Puteți vedea o diagramă a altor termeni matematici aici pe Wikipedia „” Rezultatele calculului „ ,
De ce termenii speciali de aici?
- Ei bine, acest lucru este probabil deoarece în asamblare
add rbi, rax
va stoca efectiv rezultatul înrbi
. Deci, cunoașterea primului argument nu este doar un argument cătreadd
, ci destinația;add rax, rbi
va stoca rezultatul înrax
. Dacă asamblarea a fost afișată cu operatori în loc, „am avearbi += rax
șirax += rbi
. - Deoarece addend nu este întotdeauna un offset, iar augendul nu este întotdeauna baza. Deși în acest exemplu specific, „offset” este mult mai potrivit.
-
În acest caz specific, termenul „offset implicit” poate fi găsit în Instrumentul de interfață standard (TIS), versiunea 1.2 și specificația formatului de legare (ELF),
… numai intrările
Elf32_Rela
conțin un addend explicit. Intrări de tipElf32_Rel
stochează un addend implicit în locația de modificat. În funcție de arhitectura procesorului, o formă sau alta ar putea fi necesară sau mai convenabilă.În consecință, o implementare pentru o anumită mașină poate utiliza un formular exclusiv sau fie în funcție de context.
Răspuns
Addend este pur și simplu „un număr care trebuie adăugat la altul „, conform Merian Webster .
Comentarii
- A fost afirmată deja în răspunsul existent. Ați putea adăuga ceva mai mult la răspunsul dvs. pentru a-l face mai informativ.