2017-07-19 20 views
1

有沒有辦法更改所有常量指針的目標部分?對我而言,'attibute'的選項並不好,因爲我需要一些解決方案,如果不修改源代碼就無法運行。不同部分的常量指針GCC

這裏例如:

char * myString = "Some string to print"; 

而且我們知道,myString存儲在.data和指向.RODATA。系統將在應用程序啓動期間通過從elf文件複製它來初始化它。但它只是原始數據,無法分析。問題是,當我們沒有MMU時,我們嘗試使用-fPIC和.got,指針不使用.got,因此它是錯誤的。

+1

「我需要一些解決方案,將不無源變化工作:」你確定嗎?猜測你「我需要一些解決方案,可以在不改變源代碼的情況下工作」。 – Yunnosch

+0

也許嘗試編寫自定義[鏈接器腳本](https://sourceware.org/binutils/docs/ld/Scripts.html#Scripts) –

+0

像這樣初始化的全局指針變量需要在PIC代碼中重新定位。我認爲沒有辦法解決這個問題,所以你需要禁用PIC代碼或者編寫一些執行所需重定位的小型動態鏈接器。 –

回答

0

爲了描述詳細的情況,請大家看看:

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

實際結果是: Result of the program work

在可以看到的二進制文件,該字符串被放置在.RODATA: enter image description here

正如您在程序的輸出中所看到的,指針存儲.rodata的偏移量。

0

這裏是證明,該程序正確地使用的.got: ASM .got