2013-05-25 19 views
7

Z tego co wiem, instrukcje i dane w pliku obiektowym mają wszystkie adresy. Pierwsza pozycja danych zaczyna się od adresu 0, a pierwsza instrukcja zaczyna się od adresu 0.Tabela symboli i tabela relokacji w pliku obiektowym

Tabela relokacji zawiera informacje o instrukcjach, które należy zaktualizować, jeśli adresy w pliku ulegną zmianie, na przykład jeśli plik jest powiązany z innym . Linia A w poniższym przykładzie znajduje się w tabeli relokacji. Nie sądzę, że B będzie w tabeli relokacji, ponieważ adres etykiety "równy" jest w stosunku do B. Czy są to prawidłowe założenia?

Wiem, że tabela symboli pokazuje etykiety pliku, a także etykiety, które nie zostały rozwiązane. Ale jakie inne informacje zawiera tablica symboli?

Ponadto, gdy asembler tłumaczy instrukcje na binarne, co jest umieszczone w tych instrukcjach, które mają nierozwiązane odniesienia ?. B w tym przykładzie.

.data 
TEXT: .asciiz "Foo" 

.text 
.global main 
main: 
    li t0, 1 
    beq t0, 1, equal #B 

equal: 
    la a0, TEXT 
    jal printf #A 

Odpowiedz

7

Tak, twoje założenia są prawidłowe. Istnieją różne rodzaje relokacji, to, co asembler emituje do instrukcji, zależy od typu. Zasadniczo jest to offset do dodania. Możesz użyć objdump -dr, aby zobaczyć relokacje. Dla lepszego zobrazowania mam zmieniony kod trochę:

.data 
.int 0 
TEXT: .asciiz "Foo" 
.text 
.global main 
main: 
    li $t0, 1 
    beq $t0, 1, equal #B 
    bne $t0, 42, foo #C 

equal: 
    la $a0, TEXT 
    jal printf #A 

wyjściu objdump:

00000000 <main>: 
    0: 24080001  li  t0,1 
    4: 24010001  li  at,1 
    8: 11010004  beq  t0,at,1c <equal> 
    c: 00000000  nop 
    10: 2401002a  li  at,42 
    14: 1501ffff  bne  t0,at,14 <main+0x14> 
         14: R_MIPS_PC16 foo 
    18: 00000000  nop 

0000001c <equal>: 
    1c: 3c040000  lui  a0,0x0 
         1c: R_MIPS_HI16 .data 
    20: 0c000000  jal  0 <main> 
         20: R_MIPS_26 printf 
    24: 24840004  addiu a0,a0,4 
         24: R_MIPS_LO16 .data 

Jak powiedział, nie ma relokacji dla beq ponieważ to względny adres w tym pliku wynikowego.

Dodana (linia oznaczona C) odwołuje się do zewnętrznego symbolu, więc mimo tego, że adres jest względny, potrzebny jest wpis relokacji. Będzie to typ R_MIPS_PC16, aby wygenerować 16-bitowe przesunięcie słowa ze znakiem do symbolu foo. Ponieważ kodowanie instrukcji wymaga odsunięcia od następnego słowa, a nie bieżącego PC, którego używa relokacja, 1 musi zostać odjęte, a to jest zakodowane jako uzupełnienie 2 w instrukcji.

la pseudoinstruction jest tłumaczony przez montera w lui/addiu pary (ten ostatni w gnieździe opóźnienia w jal). W przypadku przeniesienia lui do sekcji .data zostanie wypełnione 16 najlepszych bitów. Ponieważ symbol TEXT znajduje się pod adresem 4 w sekcji .data, górne 16 bitów przesunięcia to 0. Oznacza to, że instrukcja zawiera przesunięcie 0. Podobnie w przypadku 16 bitów o niskiej wartości, z wyjątkiem instrukcji, która zawiera przesunięcie 4.

Wreszcie, jal printf używa jeszcze innego rodzaju relokacji, która jest dostosowana do kodowania wymaganego przez instrukcję. Przesunięcie wynosi zero, ponieważ skok jest bezpośrednio do przywoływanego symbolu. Zauważ, że objdump stara się być pomocny przez dekodowanie, ale nie przetwarza relokacji, więc jej wynik jest oczywiście nonsensem.

+0

Nie jestem pewien, co masz na myśli mówiąc "Ponieważ symbol TEKST znajduje się pod adresem 4 w sekcji .data, górne 16 bitów przesunięcia wynosi 0". Jak wyglądałaby tablica symboli? – Carlj901

+0

Uwaga Dodałem liczbę całkowitą na początku sekcji danych, dlatego "TEKST" ma adres 4. – Jester

+0

Ah, rozumiem to teraz. Jakie informacje zawiera tabela symboli dla tego pliku? – Carlj901