GCC LD NOLOAD 链接器部分生成可加载段

2023-12-22

我正在开发 Arm 裸机应用程序,并且我用以下标记标记了一些部分NOLOAD。根据中的解释了解嵌入式软件中的链接描述文件 NOLOAD 部分 https://stackoverflow.com/q/57181652/6271889,我期望生成的 ELF 文件为not这些部分有一个可加载的段(程序头),但确实如此。

它是否正确?为什么这些部分在 ELF 文件中被标记为可加载?

由于链接器仍在将数据放入.bss,加载程序应该如何知道不应加载这些部分?或者我是否错过了“负载”的含义NOLOAD只对已初始化符号(通常会被放入.data)?

这是我的链接器脚本的一部分:

    .bss (NOLOAD) :
    {
        . = ALIGN(4);
        __bss_start__ = .;
        *(.bss_begin .bss_begin.*)

        *(.bss .bss.*)
        *(COMMON)

        *(.bss_end .bss_end.*)
        . = ALIGN(4);
        __bss_end__ = .;
    } >DRAM

    .noinit (NOLOAD) :
    {
        . = ALIGN(4);
        __noinit_start__ = .;

        *(.noinit .noinit.*)

         . = ALIGN(4) ;
        __noinit_end__ = .;
    } > DRAM
    
    /* Check if there is enough space to allocate the main stack */
    ._stack (NOLOAD) :
    {
        . = ALIGN(4);
        
        . = . + __Main_Stack_Size ;
        
        . = ALIGN(4);
    } >DRAM

这是输出 ELF 文件:

arm-none-eabi-readelf.exe -l test.elf

Elf file type is EXEC (Executable file)
Entry point 0x601b9
There are 2 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x010000 0x00060000 0x00060000 0x06840 0x06840 RWE 0x10000
  LOAD           0x020000 0x20010000 0x20010000 0x00000 0x06084 RW  0x10000

 Section to Segment mapping:
  Segment Sections...
   00     .text .ARM.exidx.reset .data
   01     .systemclock .bss ._stack

为什么是.bss and ._stack那里的部分?

Thanks!!


第二段的FileSiz为0,这意味着没有数据将从elf文件加载到该段中。

该段存在于表中的原因是,在非嵌入式系统上,程序加载器仍然需要为该段中的段请求内存,并使用相关属性(在本例中为可读和可写)标记相关页面。

编辑:再次阅读问题后,我做了更多实验,似乎所有(NOLOAD)似乎要做的是将输出文件中的节的类型设置为SHT_NOBITS。 elf 规范将其称为不占用文件空间但仍然是程序内存映像的一部分的部分。

如果目标是在加载程序之前链接到 ROM 中已存在的代码,则应在任何部分之外的链接描述文件中定义这些符号。例如。already_present_code = 0x06000000; SECTIONS { .text : {*(.text*)} /* ... */}。这似乎达到了预期的效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC LD NOLOAD 链接器部分生成可加载段 的相关文章

随机推荐

  • 使用 bquote 和向量变量的图例

    我想用包含 4 行的 bquote 绘制图例 kappa 0 5 kappa 1 kappa 1 5 kappa 5 示例 kappa var lt c 0 5 1 0 1 5 5 0 plot 1000 type n xlab x yla
  • 如何获取使用顶级语句的 C# 9 程序的 Reflection TypeInfo?

    假设我有一个用 C 9 编写的简单脚本 如下所示 using System using System IO What to put in the var exeFolder Path GetDirectoryName typeof Asse
  • 如何突出显示 mat-table Angular 7 中新插入的行

    我有一个 mat table 在其中显示行列表 我有一个添加新按钮 用户可以通过该按钮手动添加行 工作堆栈闪电战 https stackblitz com edit angular axjzov 8zmcnp https stackblit
  • 使用 string.format 在字符串中插入空格

    我之前一直使用 C String Format 来格式化数字 在本例中我只是想插入一个空格 String Format 0 123456 output 123 456 在这种特殊情况下 数字是一个字符串 我的第一个想法是简单地将其解析为一个
  • 我的静态搜索有问题吗?

    当我尝试实现 QuiesenceSearch 时 我的基于 negamax 的人工智能不断出现奇怪的行为 我基于来自的伪代码here https chessprogramming wikispaces com Quiescence Sear
  • 有什么方法可以识别PHP中的F5刷新吗?

    有什么方法可以识别是否有人使用 PHP 刷新了当前页面而不是从其他地方到达 我只能访问当前页面的代码 因此无法从其他页面传递任何内容进行检查 您的问题的标题表明您正在专门寻找一种方法来检测何时使用 F5 键刷新页面 如果是这种情况 您肯定需
  • 为什么 pandas groupby().transform() 需要唯一索引?

    我想使用 groupby transform 对 已排序 数据集中的每个记录块进行自定义 累积 转换 除非我确保我有唯一的密钥 否则它不起作用 为什么 这是一个玩具示例 df pd DataFrame 1 1 1 2 2 3 3 4 3 5
  • 如何在不冒 OOM 杀手风险的情况下 mmap() 大文件?

    我有一个嵌入式 ARM Linux 机器 其 RAM 量有限 512MB 且没有交换空间 我需要在其上创建并操作一个相当大的文件 200MB 将整个文件加载到 RAM 中 修改 RAM 中的内容 然后再次将其写回有时会调用 OOM kill
  • 如何更改 xcode 4 中的文件路径?

    我有一个项目 其中有几个文件是红色的 在 XCode 3 中 我曾经单击文件 获取信息 并更改路径 但我不知道如何在新的 XCode 4 中执行此操作 单击您的文件 然后打开右侧窗格 右上角有一个按钮 在那里您将看到身份和类型 在位置下拉菜
  • 从 Java 中创建 SQL 批量更新

    我想更新 mySql 数据库中特定列上的每一行 目前我正在使用java sql PreparedStatement对于每一行并在 for 循环中迭代 我想知道在 Java 编程方面是否还有其他替代方案可以减少时间和资源消耗 比如批量执行准备
  • 内容安全策略指令“script-src”的源列表包含 safari Angular 5 中的无效源

    我已经在 Angular 5 中实现了 google recapthca 它对所有浏览器都运行良好 但在 safari 中我收到以下错误 内容安全策略指令 script src 的源列表包含无效源 strict dynamic 它将被忽略
  • 使用 jq 创建 JSON 文件

    我尝试通过执行以下命令来创建 JSON 文件 jq arg greeting world hello greeting gt file json 该命令在没有任何输入的情况下卡住了 尽管 jq n arg greeting world he
  • 如何从 Deno 运行任意 shell 命令?

    我想从 Deno 运行任意 bash 命令 就像使用child process在节点中 这在 Deno 中可能吗 Deno 1 28 0 添加了一个新的 API 来运行 shell 命令 Deno Command https deno la
  • 在 Weblogic Server 中使用 JAXB 解组

    具体规格 服务器 由客户修复的Weblogic 9 2 由客户修复的 wsdl 和 xsd 文件定义的 Web 服务 不允许修改 Hi 在项目中我们需要开发一个邮件系统 这必须与网络服务共同工作 我们创建一个 Bean 它从非根 xsd 元
  • 在 javascript 中检测同一应用程序打开的多个 chrome 选项卡

    有没有办法检测同一应用程序是否打开了多个浏览器选项卡 假设我有 www test com 并且我打开了该网站的 4 个选项卡 有没有办法检测 JavaScript 中打开的多个选项卡 你可以用我的sysend js 库 https gith
  • 获得 Vaadin 树物品的兄弟姐妹?

    我需要获取 Vaadin 树中特定项目的兄弟姐妹 我可以做这个 Object itemId event getItemId Object parentId tree getParent itemId Collection siblings
  • Haskell初学者,尝试输出一个列表

    我想这里的每个人都已经看过其中一个 或至少是类似的 问题 但我仍然需要问 因为我在任何地方都找不到这个问题的答案 主要是因为我不知道我到底应该看什么 为了 我写了这个小脚本 其中 printTriangle 应该打印出帕斯卡三角形 fac
  • 无法消除 Firefox 链接中的虚线轮廓?

    我有一个完整的 imgs 列表 ul li a href img src test png li gt a li li a href img src test png li gt a li li a href img src test pn
  • 单击按钮时获取 asyncfileupload 控件文件名

    我在我的 asp net 页面上使用 ajaxfileupload 控件 上传图像后 我调用 uploadcomplete 方法将图像保存在磁盘上并使用以下 JavaScript 在图像控件中显示 string fileName Guid
  • GCC LD NOLOAD 链接器部分生成可加载段

    我正在开发 Arm 裸机应用程序 并且我用以下标记标记了一些部分NOLOAD 根据中的解释了解嵌入式软件中的链接描述文件 NOLOAD 部分 https stackoverflow com q 57181652 6271889 我期望生成的