C 不同部分中的常量指针

C 不同部分中的常量指针,c,pointers,gcc,linker,constants,C,Pointers,Gcc,Linker,Constants,有没有办法更改所有常量指针的目标部分?对我来说,使用“attibute”选项是不合适的,因为我需要一些解决方案,如果不更改源代码,这些解决方案将无法工作 例如: char * myString = "Some string to print"; 正如我们所知,myString存储在.data中并指向.rodata。在应用程序启动期间,系统将通过从elf文件复制来初始化它。但这只是原始数据,无法分析。问题是,当我们没有MMU,并且尝试使用-fPIC和.get时,指针不使用.get,因此它是ico

有没有办法更改所有常量指针的目标部分?对我来说,使用“attibute”选项是不合适的,因为我需要一些解决方案,如果不更改源代码,这些解决方案将无法工作

例如:

char * myString = "Some string to print";

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

要详细描述情况,请看:

#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;
}
#包括
#包括
static char*SomeString=“Hue-Hue,这是我的字符串!\n”;
静态uint32_t变量=0xDEADBEEF;
静态uint32_t*指针=NULL;
静态uint32_t Variable2=0xBEEFBABA;
//=========================================
/**
*应用程序的主条目
*
*@param Argc参数计数器
*@param Argv参数数组
*
*@返回结果
*/
//=========================================
int main(int Argc,字符**Argv)
{
printf(“Hello ChocoOS-用户空间世界!\n”);
printf(“很高兴来到这里!\n”);
printf(“这是数据节中的字符串:'%s'\n',SomeString”);
printf(“这里是来自数据段的变量:0x%08X\n”,变量);
指针=&变量2;
printf(“Variable2=0x%08X\n”,Variable2);
printf(“指向变量2的指针=0x%08X\n”,指针);
printf(“指针的值=0x%08X\n”,*指针);
printf(“字符串指针=0x%08X\n”,SomeString);
返回0;
}
实际结果是:

在二进制文件中,您可以看到字符串被放置在.rodata中:


正如您在程序输出中看到的,指针存储.rodata的偏移量

要详细描述情况,请看:

#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;
}
#包括
#包括
static char*SomeString=“Hue-Hue,这是我的字符串!\n”;
静态uint32_t变量=0xDEADBEEF;
静态uint32_t*指针=NULL;
静态uint32_t Variable2=0xBEEFBABA;
//=========================================
/**
*应用程序的主条目
*
*@param Argc参数计数器
*@param Argv参数数组
*
*@返回结果
*/
//=========================================
int main(int Argc,字符**Argv)
{
printf(“Hello ChocoOS-用户空间世界!\n”);
printf(“很高兴来到这里!\n”);
printf(“这是数据节中的字符串:'%s'\n',SomeString”);
printf(“这里是来自数据段的变量:0x%08X\n”,变量);
指针=&变量2;
printf(“Variable2=0x%08X\n”,Variable2);
printf(“指向变量2的指针=0x%08X\n”,指针);
printf(“指针的值=0x%08X\n”,*指针);
printf(“字符串指针=0x%08X\n”,SomeString);
返回0;
}
实际结果是:

在二进制文件中,您可以看到字符串被放置在.rodata中:


正如您在程序输出中看到的,指针存储.rodata的偏移量

下面是程序正确使用的证明。得到:
以下是程序正确使用的证明。获得:

“我需要一些解决方案,如果不更改源代码,这些解决方案将无法工作”,您确定吗?我猜你“我需要一些解决方案,可以在不改变源代码的情况下工作”。也许可以尝试编写一个自定义的全局指针变量,该变量需要在PIC代码中重新定位。我认为没有办法解决这个问题,所以你需要禁用PIC代码或编写一些微型动态链接器来执行所需的重新定位。事实上,我正在为嵌入式架构设计的操作系统中使用我自己的链接器脚本()。我想在其中运行ELF文件。一般来说,它可以工作,但问题是,我没有MMU,所以我必须使用-fPIC。程序被构建并放入SD卡中。系统分析ELF文件,读取程序段,并对其进行更新。当全局指针被初始化到.rodata节时,这种情况仍然有效。我知道,我可以把变量放到不同的部分,然后更新部分,但我不想更改程序的源代码,否则每次,当你想为系统构建一个程序时,你都必须更新所有的全局变量。例如,如果您想要构建gcc,那么它将花费太多的时间“我需要一些在源代码没有更改的情况下无法工作的解决方案”,您确定吗?我猜你“我需要一些解决方案,可以在不改变源代码的情况下工作”。也许可以尝试编写一个自定义的全局指针变量,该变量需要在PIC代码中重新定位。我认为没有办法解决这个问题,所以你需要禁用PIC代码或编写一些微型动态链接器来执行所需的重新定位。事实上,我正在为嵌入式架构设计的操作系统中使用我自己的链接器脚本()。我想在其中运行ELF文件。一般来说,它可以工作,但问题是,我没有MMU,所以我必须使用-fPIC。程序被构建并放入SD卡中。系统分析ELF文件,读取程序段,并对其进行更新。当全局指针被初始化到.rodata节时,这种情况仍然有效。我知道,我可以把变量放到不同的部分,然后更新部分,但我不想更改程序的源代码,否则每次,当你想为系统构建一个程序时,你都必须更新所有的全局变量。例如,如果您想构建gcc,它将花费太多的时间