Od Nauka analizy plików binarnych systemu Linux , autor: Ryan „elfmaster” O „Neill . Na stronie 32 autor stwierdza,
Rekordy relokacji dla 32-bitowych plików ELF są takie same jak dla 64-bitowych, ale używaj 32-bitowych liczb całkowitych. Poniższy przykład dla kodu pliku obiektowego zostanie skompilowany jako 32-bitowy, abyśmy mogli zademonstrować niejawne dodatki, które nie są tak często używane w 64-bitowych. An niejawne dodanie występuje, gdy rekordy relokacji są przechowywane w strukturach typu
ElfN_Rel
, które nie zawierająr_addend
i dlatego dodatek jest przechowywany w samym celu relokacji. 64-bitowe pliki wykonywalne zazwyczaj używają strukturElfN_Rela
, które zawierają jawne dodanie . Myślę, że warto zrozumieć oba scenariusze, ale ukryte dodatki są trochę bardziej zagmatwane, więc warto rzucić światło na ten obszar.
Co to jest rzeczywista definicja „addend” ?
Comments
- english.stackexchange.com/search?q=addend
- Dodaj + dodaj, minus-subtrahend, multiplicand * multiplier, dividend / divisor
Odpowiedź
Myślę, że oznacza to po prostu „liczbę, która została„ dodana ”, aw tym przypadku„ liczbę, która ”została dodana do adresu podstawowego ładowania ( lub segment ładowania adresu), aby obliczyć ostateczny wskaźnik dla tej relokacji ”.
Wyobraźmy sobie, że kiedy ładujemy nasz plik binarny do pamięci pod adresem 0x400000, mamy wskaźnik 0x401234, który wskazuje na 0x405678. (Jeśli zamiast tego załadowaliśmy plik binarny pod adresem 0x800000, to powinno wskazywać na 0x805678, dlatego wymaga zmiany lokalizacji.) Nie znam ELF, ale czytam to tak, że
-
in t Przypadek niejawny tablica relokacji przechowuje tylko przesunięcia w twoim pliku binarnym, w tym przypadku 0x1234, aw naszym pliku binarnym pod offsetem 0x1234 przechowujemy docelowy offset 0x5678. Dlatego relokacja staje się
dla każdego adresu
A
w tabeli relokacji*(base + A) += base
(To tak działają tablice relokacji w plikach PE.)
-
W jawnym przypadku tablica relokacji przechowuje przesunięcie w pliku binarnym i przesunięcie docelowe, tj. 0x1234 0x5678. Zatem relokacja jest tutaj
dla każdej pary adresów
A, B
w tabeli relokacji*(base + A) = base + B
Nie wiem, co dzieje się w tym przypadku w pliku binarnym pod przesunięciem 0x1234.
Odpowiedź
- Augend to termin oznaczający liczbę, która podlega dodaniu
- Dodaj to liczba, którą będziesz dodawać.
From Dictionary.com ,
Czy zdarzyło Ci się kiedyś patrzeć na kartkę z napisem„ 3 + 4 ”I zastanawiałeś się„ jaki jest właściwy termin dla każdej z tych dwóch odpowiednich wielkości? ”Nie? Pierwsza liczba to augend i numer, który zostanie do niego dodany, jest dodatkiem.
Możesz zobaczyć wykres innych terminów matematycznych tutaj na Wikipedia „s ” Wyniki obliczeń „ ,
Po co tutaj specjalne terminy?
- Cóż, jest to prawdopodobne, ponieważ w zestawie
add rbi, rax
faktycznie zapisze wynik wrbi
. Tak więc znajomość pierwszego argumentu nie jest tylko argumentem dlaadd
, ale celem;add rax, rbi
zapisze wynik wrax
. Gdyby zamiast tego wyświetlany był zespół z operatorami, mamy „drbi += rax
irax += rbi
. - Ponieważ addend nie jest zawsze przesunięciem, a augend nie zawsze jest podstawą. Chociaż w tym konkretnym przykładzie „offset” jest o wiele bardziej odpowiednie.
-
W tym konkretnym przypadku termin „niejawne przesunięcie” można znaleźć w Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification Version 1.2 ,
… tylko wpisy
Elf32_Rela
zawierają wyraźny dodatek. Wpisy typuElf32_Rel
zapisz niejawny dodatek w miejscu do modyfikacji. W zależności od architektury procesora, jedna lub druga forma może być konieczna lub wygodniejsza.W konsekwencji implementacja dla określonej maszyny może używać wyłącznie jednego formularza lub dowolnej formy w zależności od kontekstu.
Odpowiedź
Dodaj to po prostu „numer do dodania to another „, zgodnie z Merian Webster .
Komentarze
- To było już podane w istniejącej odpowiedzi. Możesz dodać trochę więcej do swojej odpowiedzi, aby była bardziej pouczająca.