Czesc,
Pracuję nad obsługą elfa w swoim systemie i mam napotkałem na pewien problem, który liczę że może ktoś już spotkał, lub może ma jakiś pomysł z czym to może być związane. Mi przychodzi aktualnie do głowy tylko, że to może jakiś bug w gcc, ale mam nadzieję, że się mylę...
Jako, że nie mam MMU, to wykorzystuję fPICa do shakowania adresów (aktualizuję je w .got). Generalnie wygląda na to, że to działa i to całkiem przyzwoicie, tylko jest jeden problem...
#include <oc_stdio.h>
#include <oc_stdtypes.h>
static char * SomeString = "Hue hue, it is my string!\n";
static uint32_t Variable = 0xDEADBEEF;
static uint32_t * Pointer = NULL;
static uint32_t Variable2 = 0xBEEFBABA;
//=========================================
/**
* The main entry of the application
*
* @param Argc Argument counter
* @param Argv Arguments array
*
* @return result
*/
//=========================================
int main( int Argc , char ** Argv )
{
printf("Hello ChocoOS - userspace World!\n");
printf("It is very nice to be here!\n");
printf("Here is string from data section: '%s'\n", SomeString);
printf("And here variable from data section: 0x%08X\n", Variable);
Pointer = &Variable2;
printf("Variable2 = 0x%08X\n", Variable2);
printf("Pointer to Variable2 = 0x%08X\n", Pointer);
printf("Value from pointer = 0x%08X\n", *Pointer);
printf("String pointer = 0x%08X\n", SomeString);
return 0;
}
Jak widać wszystkie pointery zostały zaktualizowane oprócz referencji do .rodata (jego offset to 0x00000CB8) ... Temat jest dosyć niszowy i ciężko informacje po googlach znaleźć. Miał ktoś może z tym do czynienia, albo ma pomysł jak by można było to zaktualizować?