【问题标题】:Constant pointers in different sections GCCGCC 不同部分中的常量指针
【发布时间】:2017-07-19 11:54:48
【问题描述】:

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

这里的例子:

char * myString = "Some string to print";

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

【问题讨论】:

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

标签: c pointers gcc linker constants


【解决方案1】:

详细描述情况请看:

#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 的偏移量。

【讨论】:

    【解决方案2】:

    这是程序正确使用 .got 的证明: ASM .got

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 2022-07-06
      • 2017-03-07
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多