爲了描述詳細的情況,請大家看看:
#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的偏移量。
「我需要一些解決方案,將不無源變化工作:」你確定嗎?猜測你「我需要一些解決方案,可以在不改變源代碼的情況下工作」。 – Yunnosch
也許嘗試編寫自定義[鏈接器腳本](https://sourceware.org/binutils/docs/ld/Scripts.html#Scripts) –
像這樣初始化的全局指針變量需要在PIC代碼中重新定位。我認爲沒有辦法解決這個問題,所以你需要禁用PIC代碼或者編寫一些執行所需重定位的小型動態鏈接器。 –