Hei, jeg har drevet å lekt meg litt med dynamic linking in runtime o.l. i C og bestemt meg for å ta dette et skritt lengere ved å selv skrive en implementasjon av dette, for å lære mer om hvordan maskinkoden behandles. Dette er bare for læringens skyld, jeg skal ikkje bytte ut dl[addr/close/error/sym] med min egen implementasjon bare så det er sagt.
Jeg har skrevet en enkel "library" som jeg har kompilert til en objekt fil, koden i denne "librarien" ser slik ut:
Jeg har også fått til å laste denne object filen inn til minnet med kjøre tillatelse, videre så har jeg også funnet funksjonen "something ( )" i object koden å laget en funksjons pointer til den, funksjonen starter på addresse 0x41 i forhold til starten av det allokerte minne.
Men når jeg kaller funksjonen ved hjelp av funksjons pointeren, så kjører den koden og returnerer verdien 0x7F som forventet, men den printf-delen ser ut til å utebli, jeg får ingen "Hello World!\n" output i terminalen som forventet.
Jeg har også forsket nærmere på dette ved å bruke objdump som gir meg følgende:
Jeg har unlatt .comment section og .eh_frame med vilje siden disse ikkje ser ut til å ha noe med selve kjøringen av koden å gjøre. Og jeg har også prøvd å "clean'e" objekt filen ved å fjerne alt annet enn .text delen og .rodata, men da krasjet bare programmet, å fjerne unødvendig data fra objekt filen og kun laste inn .text delen har fungert tidligere når jeg ikkje har hatt data i .rodata delen.
Hvis jeg disassembler object filen så blir den som følgende:
Kan noen forklare meg hvorfor printf ( ) ikkje ser ut til å få "Hello World!" som argument? Eller at den hele funksjonen kallet uteblir? Det skal også nevnes at mine assembly kunnskaper er nokså begrenset.
Jeg har skrevet en enkel "library" som jeg har kompilert til en objekt fil, koden i denne "librarien" ser slik ut:
Kode
#include <stdio.h> int something ( ) { printf ( "Hello World!\n" ); return 0x7F; }
Kode
something = ( int ( * )( ))( mcode + 0x41 );
Jeg har også forsket nærmere på dette ved å bruke objdump som gir meg følgende:
Kode
Contents of section .text: 554889e5 bf000000 00e80000 0000b87f UH.............. 0000005d c3 ...]. Contents of section .rodata: 48656c6c 6f20576f 726c6421 00 Hello World!.
Hvis jeg disassembler object filen så blir den som følgende:
Kode
push %rbp mov %rsp, %rbp mov $0x0, %edi callq e <something+0xe> mov $0x7F, %eax pop %rbp retq