You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过链接脚本将C++类静态链接到指定内存区域

问题根因

你当前代码中的MemAssembly * pMemAssembly;是未初始化的野指针,没有创建任何实际的类实例,直接调用成员函数属于未定义行为,打印出的0x7f开头地址是栈上的随机垃圾值,和链接脚本配置无关。
类本身只是类型定义,不占用实际运行内存,链接阶段需要分配固定地址的是实例化后的类对象(即存储类成员变量的内存块),类的成员函数默认会被编译到.text代码段,不需要单独为类定义本身做链接配置。

修改步骤

1. 调整链接脚本,新增自定义内存段

在原有链接脚本中新增专属段,用来存放MemAssembly类的实例,比如我们指定类实例的起始地址为0x8000100,修改后内容如下:

SECTIONS
{
  . = 0x1000000;
  .text : { *(.text) }
  . = 0x8000000;
  .data : { *(.data) }
  .bss : { *(.bss) }

  /* 新增自定义段,起始地址设为0x8000100,专门存放MemAssembly类实例 */
  . = 0x8000100;
  .mem_class_sec : { *(.mem_class_sec) }
}

如果你需要把类的成员函数也放到指定独立地址,只需要在对应地址位置新增代码段收集规则即可,原有汇编代码不需要任何修改。

2. 修改代码,声明静态实例并指定段属性

不需要使用new做动态分配,直接通过编译器的section属性,把静态类实例分配到刚才自定义的段中,链接阶段就会自动把实例放到你指定的地址:

  • 在main.cpp的全局区域(所有函数外部)直接定义带段属性的类实例:
/* 把MemAssembly实例放到自定义的.mem_class_sec段,地址由链接脚本确定 */
MemAssembly mem_assembly_obj __attribute__((section(".mem_class_sec")));
  • 修改main函数中原来的野指针代码,让指针指向这个静态分配的实例:
// 删掉原来未初始化的指针声明,替换为以下内容
MemAssembly * pMemAssembly = &mem_assembly_obj;
pMemAssembly->MemDump();

可选:将类成员函数也放到指定内存区域

如果你需要把MemAssembly的成员函数(构造函数、析构函数、自定义方法等)也放到非默认.text的指定地址,只需要给成员函数声明也加上section属性,修改mem.h中的类定义即可:

class MemAssembly{
    public:
        MemAssembly() __attribute__((section(".text.mem_class")));
        ~MemAssembly() __attribute__((section(".text.mem_class")));
        int AssemblyMemoryDump(void) __attribute__((section(".text.mem_class")));

        void MemDump(void) __attribute__((section(".text.mem_class")))
        { 
            printf("RAX_Accumulator ---> Read A : %#018" PRIx64 " \n",_MEMORY_READ_A());
            printf("RAX_Accumulator ---> Read B : %#018" PRIx64 " \n\n",_MEMORY_READ_B());
        }
};

同时在链接脚本的.text段中加入对应段的收集规则即可:

.text : { 
    *(.text) 
    *(.text.mem_class)
}

如果需要把成员函数放到独立的地址区间,只需要和之前自定义数据段一样,先设置.的位置值,再新建段收集即可。

注意事项
  • 重新编译链接后运行,打印出的pMemAssembly地址就会是你在链接脚本中设置的固定值,不会再出现随机地址
  • 如果是在Linux用户态环境测试,需要先关闭地址空间随机化,否则动态加载器会对程序做地址重定位,覆盖你设置的固定链接地址,临时关闭命令为echo 0 > /proc/sys/kernel/randomize_va_space,裸机、RTOS等嵌入式场景不存在该问题
  • 不要使用未初始化的类指针访问成员,否则会触发内存访问错误或者出现不可预期的运行结果

内容的提问来源于stack exchange,提问作者IceDefcon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:15:46