GCC不同部分的常量指针

时间:2017-07-19 11:54:49

标签: c pointers gcc linker constants

有没有办法更改所有常量指针的目标部分?对我来说,选择' attibute '不行,因为我需要一些解决方案,如果没有源代码的更改,将无法正常工作。

这里的例子:

char * myString = "Some string to print";

正如我们所知,myString存储在.data中并指向.rodata。系统将在应用程序启动期间通过从elf文件复制它来初始化它。但它只是原始数据,无法分析。问题是,当我们没有MMU,并且我们尝试使用-fPIC和.got时,指针不使用.got,所以它是正确的。

2 个答案:

答案 0 :(得分: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的偏移量。

答案 1 :(得分:0)

以下是程序正确使用.got的证据: ASM .got