2017-07-19 1 views
1

Gibt es eine Möglichkeit, den Zielbereich aller konstanten Zeiger zu ändern? Für mich ist die Option mit 'attibute' nicht in Ordnung, weil ich eine Lösung brauche, die ohne Änderungen im Quellcode nicht funktioniert.Konstante Zeiger in verschiedenen Abschnitten GCC

Hier Beispiel:

char * myString = "Some string to print"; 

Und wie wir wissen, myString in der .data und verweist auf die .rodata gespeichert. Das System initialisiert es, indem es es beim Start der Anwendung aus der Elf-Datei kopiert. Aber es sind nur Rohdaten, es kann nicht analysiert werden. Das Problem ist, dass, wenn wir keine MMU haben und wir versuchen, -fPIC und .got zu verwenden, der Zeiger das .got nicht verwendet, also ist es icorrect.

+1

„Ich brauche eine Lösung, die ohne Änderungen in der Quelle nicht funktionieren“ Sind Sie sicher? Bei einer Schätzung "Ich brauche eine Lösung, die ohne Änderungen in der Quelle funktioniert". – Yunnosch

+0

Vielleicht versuchen, ein benutzerdefiniertes [Linker-Skript] (https://sourceware.org/binutils/docs/ld/Scripts.html#Scripts) zu schreiben –

+0

Eine globale Zeigervariable, die wie folgt initialisiert wird, benötigt eine Verschiebung in PIC-Code. Ich denke nicht, dass es einen Weg gibt, um dies zu umgehen, also müssen Sie den PIC-Code deaktivieren oder einen winzigen dynamischen Linker schreiben, der die erforderlichen Relokationen durchführt. –

Antwort

0

die Situation im Detail zu beschreiben, nehmen Sie bitte einen Blick:

#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; 
} 

tatsächliches Ergebnis ist: Result of the program work

Im binär Sie sehen können, dass die Zeichenfolge im .rodata platziert werden: enter image description here

Und wie Sie in der Ausgabe des Programms sehen können, speichert der Zeiger Offset der .rodata.

0

Und hier ist der Beweis, dass das Programm korrekt verwendet .got: ASM .got

Verwandte Themen