首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么有多个.rodata部分映射到加载段,而在链接器脚本中只指定了一个.rodata输出部分?

.rodata是一种只读数据段,通常包含程序中的常量数据,如字符串常量、全局常量等。在链接器脚本中,可以通过指定一个.rodata输出部分来告诉链接器将.rodata段的内容输出到可执行文件中的特定位置。

然而,有时候一个程序可能包含多个.rodata段,这是因为不同的.rodata段可能具有不同的属性或用途。这些不同的.rodata段可以通过链接器脚本中的其他指令来指定其输出部分。

多个.rodata部分映射到加载段的原因是为了优化内存使用和访问效率。将不同属性或用途的.rodata数据分开映射到不同的加载段,可以使得程序在运行时只加载需要的部分数据,减少内存占用。同时,这种分离还可以提高程序的访问效率,因为不同的加载段可以具有不同的访问权限和缓存策略。

对于这种情况,可以通过链接器脚本中的其他指令来指定每个.rodata段的输出部分。具体的操作方式和语法可能因不同的开发工具链而有所不同,可以参考相应工具链的文档或手册来了解详细的用法。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

9_重定位

,并手动指定不同输出文件的位置。...JTAG等调试一般支持一体式链接脚本; 9.2.3 清除bss ​ 之前提到过bin文件并不会保存bss的值,因为这些值都是0,保存这些值没有意义并会使得bin文件臃肿。 ​...所以我们将.data重定位后的地址设置为0x900000。 9.3.2.4 步骤2:修改链接脚本 ​ 创建一个变量用来存储.data的起始加载地址。...使用取址符号(&)得到该变量的值,例如:int * p = & _ start; //p的值为lds文件_start的值 ​ 为什么在汇编文件可以直接使用链接脚本的变量,而在C函数需要加上取址符号呢...原因:C函数定义一个全局变量int g_i = 10;,程序必然4字节的空间留出来给这个变量g_i,然而链接脚本的变量并像全局变量一样都保存在.bin文件

99010

makefile使用.lds链接脚本以及 @,^, $,< 解析

这个脚本里规定两个,firtst和cecond 0x00000000   0x30000000    表示链接地址或运行地址,指程序在SRAM、SDRAM实际运行的地址,也就是使PC等于这个地址。....o文件时,这时候.lds链接脚本 又该如何安排它们在可执行文件的顺序?...这里就需要将多个目标文件的.text、.data和.bss等链接在一起而链接脚本文件是告诉链接从什么地址开始放置这些 .text:代码,存放程序执行代码的一块内存 .data:读/写数据,存放已初始的全局变量或静态变量的一块内存...SECTIONS :最重要的,最基本的,也是最主要的命令,它告诉链接如何把输入文件的各个section输出到目标文件的各个section中去。...),将所有的.rodata只读数据合并成一个.rodata只读数据      . = ALIGN(4);    .data : { *(.data) }            //指定读写数据,

77420
  • makefile使用.lds链接脚本以及 常用命令 解析

    1.分析一个简单的.lds链接脚本   例1,假如现在有head.c init.c nand.c main.c这4个文件: 1.1 首先创建链接脚本nand.lds: 1 SECTIONS { 2...这个脚本里规定两个,firtst和cecond 0x00000000 0x30000000   表示链接地址或运行地址,指程序在SRAM、SDRAM实际运行的地址,也就是使PC等于这个地址。   ....o文件时,这时候.lds链接脚本 又该如何安排它们在可执行文件的顺序?   ...这里就需要将多个目标文件的.text、.data和.bss等链接在一起而链接脚本文件是告诉链接从什么地址开始放置这些 .text: 代码,存放程序执行代码的一块内存 .data: 读/写数据...SECTIONS :最重要的,最基本的,也是最主要的命令,它告诉链接如何把输入文件的各个section输出到目标文件的各个section中去。 2.

    2K20

    makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析

    这个脚本里规定两个,firtst和cecond 0x00000000   0x30000000    表示链接地址或运行地址,指程序在SRAM、SDRAM实际运行的地址,也就是使PC等于这个地址。....o文件时,这时候.lds链接脚本 又该如何安排它们在可执行文件的顺序?...这里就需要将多个目标文件的.text、.data和.bss等链接在一起而链接脚本文件是告诉链接从什么地址开始放置这些 .text:代码,存放程序执行代码的一块内存 .data:读/写数据,存放已初始的全局变量或静态变量的一块内存...SECTIONS :最重要的,最基本的,也是最主要的命令,它告诉链接如何把输入文件的各个section输出到目标文件的各个section中去。...(4); .rodata : { *(.rodata) } //指定.rodata section(位于0x00000000+.text section),将所有的.rodata只读数据合并成一个

    1.9K100

    程序一定要从main函数开始运行吗?

    对于静态链接先提出两个问题: Q: 每个目标文件都有好多个,目标文件在被链接成可执行文件时,输入目标文件的各个如何被合并到输出文件?...A: 合并相似的,将所有的.text合并到输出文件的.text,将所有的.data合并到输出文件的.data。 Q: 链接如何为他们分配在输出文件的空间和地址?...一个编译选项叫函数级别链接,可以使得某个函数或变量单独保存在一个里面,都链接需要用到某个函数时,就将它合并到输出文件,对于没用到的函数则将他们抛弃,减少空间浪费,但这会减慢编译和链接过程,GCC...如何指定程序入口 在ld链接过程中使用-e参数可以指定程序入口,由于一简短的printf函数其实都依赖多个链接库,我们也不太方便使用链接脚本将目标文件与所有这些依赖库进行链接,所以使用下面这段内嵌汇编的程序来打印一字符串.../test hello 如何使用自定义链接脚本实现自定义的功能 在ld链接过程中使用-T参数可以指定链接脚本,通过ld -verbose可以查看默认的链接脚本,原文太长,这里简单截取了一部分: $

    1.2K30

    RT-thread finsh移植到linux平台

    链接链接脚本 要实现C-Style模式, 还必须借助链接脚本对程序进行特殊的控制(文件是计算机操作的基本单位,而则是链接操作的基本单位。一个文件可以包含一个多个。...对于链接来说,它不关心有多少个输入文件,而关心有多少个输入)。...我们已经在代码中指定FSymTab和VSymTab, 还需要在链接脚本定义这两个为什么需要在链接脚本定义这两个呢,是因为这两个是我们自定义的, 缺省的链接脚本缺少对自定义数据的声明),...思考扩展 思考 在finsh移植到linux的过程, 主要用到了2个编译链接技巧 1.利用编译的编译特性, 实现在编译时将某个函数/变量放到指定Fsymtab...Fsymtab定义的函数 上述两个技巧可以在主流的编译链接上适用, 利用编译的特性我们很容易实现将函数放在指定,然而每次都要修改链接脚本就显得不那么方便(想要了解linux默认链接脚本的同学可以参考

    3.2K10

    用GCC开发STM32入门二

    之前从网上下载一份用GCC开发stm32的程序,也是用的stm32的库函数编程,启动文件是startup_stm32f10x_hd.s,链接脚本文件是从gcc_ride7拷贝出的stm32f10x_flash_extsram.ld...但是编译一下,出现一大堆的错误。于是干脆不用这些文件,从网上查资料,自己写启动文件和链接脚本。...然后链接脚本文件告知链接,把所有目标文件相应的连接到一起,并把目标文件的“变量地址”“函数地址”重定位至正确的地址空间; 编写前需要知道C程序编译后的典型内存布局 ,单片机的启动流程以及链接脚本文件的作用和编写等知识....text和常量表格数据等.rodata,.data对应初始化了的全局变量,编译后将位于可执行文件,由启动代码负责加载 到数据区(在单片机部分数据会存于flash,需要有启动代码把这部分内容拷贝到...一般来说,目标文件包含 .text: 可执行代码 .rodata: 只读的数据,对应程序的常量 .data: 初始化的全局变量 .bss: 未初始化的全局变量 连接所作的工作简单的讲就是

    1.8K20

    浅析C++内存布局

    编译会去掉重复的字符串常量,程序的每个字符串常量只有一份。 有些系统rodata多个进程共享的,目的是为了提高空间利用率。...余下的空间被称为堆区(在栈与堆之间部分动态分配的姑且称之为共享区,叫法可能不一样)。...一个空类对象的大小是1,为什么不是0? 类A明明是空类,它的大小应该为0,为什么编译输出的结果为1呢?....o文件连接成可执行文件;可分为编译时链接加载链接(程序被加载到内存执行时),运行时链接(由应用程序来执行时)。...子进程通过execve系统调用调用加载加载删除现有的虚拟内存,创建新的代码段数据堆栈,新堆栈被初始化为0,通过将虚拟地址空间的页映射到可执行文件的页面大小chunk,新的代码和数据被初始化为可执行文件的内容

    1.2K40

    从零手写操作系统之RVOS内存管理模块简单实现-02

    PQMagic等),以及另外的一些须要特殊的链接过程的程序,如一些内核驱动程序等,它们往往受限于一些特殊的条件,如须要指定输出文件的各个虚拟地址、的名称、存放的顺序等,因为这些特殊的环境,特别是某些硬件条件的限制...在编译普通的应用程序时,可以使用默认的链接脚本,但是对于内核程序来说,它本身也是一个.elf文件,这个.elf文件该怎么组织,各个放到内存什么地方,这个由于和底层硬件强相关,所以需要我们自己编写相关的链接脚本...: 在之前的环境准备小节,我们makefile文件编写的ld链接命令通过-Ttext=0x80000000命令指明了代码的在内存的起始地址 os.elf: ${OBJS} ${CC} ${...链接脚本用于指导链接如何组织可执行文件的各个部分,包括代码、数据、符号表等。 在C代码,无法直接引用链接脚本定义的符号的值,因为C编译并不了解链接脚本的细节。...在c程序获取链接脚本定义的符号,两种方式: 链接脚本中使用PROVIDER定义符号,并在c语言中通过extern声明外部变量进行绑定 SECTIONS { .text : {

    23240

    用GCC开发STM32,正点原子开发板的一个库函数版本例程示例

    $@:代表规则的目标文件名:可以使用@-->at 代表目标的意思    $%:规则的目标文件是一个静态库文件时,代表静态库的一个成员名.    $<:规则的第一个依赖文件名.   ...$(*D): 代表"茎"的目录部分    $(*F): 代表"茎"的文件名部分 6. find ./ -name'*~' | xargs rm -f    当你尝试用rm 删除太多的文件,你可能得到一个错误信息...-gstabs+,-gcoff,-gxcoff,-gxcoff+,-gdwarf-version,-gvms -c    激活预处理,编译和汇编,生成obj文件.还需要通过ld链接对所有    .o...,keil里面的汇编文件不能用于gcc 链接脚本文件也特别重要。...要找能用于gcc下面的链接脚本根据需要修改。CSDN资源里完整的编译通过的例子。

    1.5K20

    riscv64 裸机编程实践与分析

    本次使用的环境是riscv64 qemu,而编译是通过下面的地址进行下载: https://www.sifive.com/software 2.最小工程的构成 一个最小的工程包含两个东西:链接脚本以及源代码...链接脚本文件则可以告诉程序的布局,比如代码,函数的入口等等。这两个文件将编译出来的程序loader到板子上运行即可。 3. 链接脚本 下面看一下hello.ld文件。...4.可执行的程序源代码分析 前面已经描述链接脚本的布局,也就是给程序指定执行的地址,每个函数以及函数入口在什么地址都已经规划好了,那么具体的入口函数该如何写呢?...-fvisibility=hidden:动态库部分需要对外显示的函数接口显示出来。 -nostdlib:不连接系统标准启动文件和标准库文件,指定的文件传递给连接。...-Thello.ld:加载链接地址。 5.2 运行 输入下面的命令即可看到Hello.字符串输出

    3.1K21

    C++学习总结2——C++内存模型

    对于一个C++程序,内存区域分六个部分:依次是rodata区,text区,data区,bss区,heap区和stack区。...其中rodata区和text区在加载时会合并到一个,该段称为常量区,该区域的内容只允许读,不允许修改; data区和bss区在加载时合并到一个,该段被称为全局区,其中的内容,对程序来说,是可读可写的...text text区保存程序编译链接后生成的机器代码。当调用函数时,会将该区域的机器代码加载到栈执行。...注意我这里给全局静态变量和局部静态变量起了相同的名字,都叫out,但在main函数里面输出的out=2,说明虽然都是在data区,但编译和链接过程全局变量和局部变量的标识还是不同的,编译不会因为名字相同而混淆两者...上面程序的全局语句“int j;”和func1的语句“static int count;”定义的j和count都在bss区。 为什么要区分初始化和未初始呢?是为了节省空间。

    56610

    全志XR系列 如何统计XRMCU的内存使用情况

    问题背景 客户反馈代码运行奔溃,但始终找不到原因,经排查后发现是剩余RAM不足导致的。客户把所有应用内存直接保存到SRAM,导致内存不足,跑应用时踩内存导致系统奔溃。...问题分析 内存是如何保存到指定位置的? GCC链接操作是以section作为最小的处理单元,只要一个section的某个符号被引用,该section就会被加入到可执行程序中去。...而在链接阶段, -Wl,–gc-sections 指示链接去掉不用的section(其中-wl, 表示后面的参数 -gc-sections 传递给链接),这样就能减少最终的可执行程序的大小了。....o存到xip *AAA.a: (EXCLUDE_FILE (bbb.o) .text) //某个静态库除了bbb.o的text,其余放到xip *bbb.*.o...(.text .text.* .rodata .rodata.*) //bbb打头的所有.o存进xip,常用于同一个make,但没有编译出静态库的场合 原贴链接:https://bbs.aw-ol.com

    14310

    Arm放弃自家的汇编语法?改投GNU

    它由两部组成开头是一个0-99直接的数字局部标号 后面加“:” F:指示编译向前搜索,代码行数增加的方向 / 代码的下一句 B:指示编译向后搜索,代码行数减小的方向 注意局部标号的跳转,就近原则...宏操作可以使用一个多个参数,当宏操作被展开时,这些参数被相应的值替换。...filename” 包含指定的头文件, 可以把一个汇编常量定义放在头文件 .equ 格式:.equ symbol, expression把某一个符号(symbol)定义成某一个值(expression...#define PI 3.1415 等价于 .equ PI, 31415 五、GNU伪指令 关键点:伪指令在编译时会转化为对应的ARM指令 ADR伪指令 :该指令把标签所在的地址加载到寄存...File) 可执行文件(Executable) 共享库(Shared Object,或者Shared Library) ELF格式提供两种不同的视角,链接把ELF文件看成是Section的集合,而加载

    2.2K30

    RT-Thread FinSH控制台添加自定义msh命令原理「建议收藏」

    FinSH 提供多个宏接口来导出自定义命令,导出的命令可以直接在 FinSH 执行。...这里还要注意一下两个概念:输入输出 输入输出是相对于要生成最终的elf或binary时的Link过程说的,Link过程的输入大都是由源代码编绎生成的目标文件.o,那么这些.o文件包含的相对...link过程来说就是输入,而Link的输出一般是可执行文件elf或库等,这些输出文件也包含有,这些输出文件就叫做输出。...输入输出本来没有什么必然的联系,是互相独立,只是在Link过程,Link程序会根据一定的规则(这些规则其实来源于Link Script),将不同的输入重新组合到不同的输出,即使是的名字,...需要着重注意的是,__attribute__的section属性指定对象的输入,它并不能影响所指定对象最终会放在可执行文件的什么

    1K10

    扒一扒ELF文件

    main.c和sum.c将分别通过翻译将源文件处理为可重定位的目标文件main.o和sum.o。翻译处理的过程包括预处理(ccp)、编译(ccl)、汇编(as) 三个过程。...链接过程   由上面的过程,我们可以看出在经过汇编后会输出一个.o文件,这个叫做可重定位的目标文件。将main.o和sum.o输入链接后,链接输出的prog文件叫做可执行目标文件。...ELF文件作用   ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待ELF格式的文件:   1.如果用于编译和链接(可重定位文件),则编译链接将把...2.如果用于加载执行(可执行文件),则加载则将把ELF文件看作是程序头表描述的的集合,一个可能包含多个节,节头表可选。 4....个表项,其中两个为可装入(即Type=LOAD):   第一可装入:第0x0000 0~0x0x8ab的长度为0x8ac字节的ELF头、程序头表、.init、.text和.rodata节,映射到虚拟地址

    74420

    认识目标文件结构

    为什么编译把未初始化的全局变量标记为一个COMMON符号,而不直接把它当作未初始化的局部静态变量,为其在.bss分配空间呢?...(2)链接时,读取了所有目标文件,确定任意一个弱符号的大小。这时才在最终输出文件的.BSS为其分配空间。 (3)总体看来,未初始化的全局变量最终还是被放在.BSS。...单独设立.rodata的好处很多,比如语义上支持C的const常量,而且操作系统在加载的时候可以将.rodata的内容映射为只读区,这样对于这个的任何修改都会被判为非法,保证程序的安全性。...表是 ELF 文件除了文件头以外最重要的结构,它描述 ELF 各个的信息,比如每个的段名、类型、长度、在文件的偏移等,编译链接和装载都是通过访问表来获取各个的属性。...11.代码重定位表(.rela.text) 通过命令 readelf -S的输出可以看到,test.o一个 .rela.text,其类型为 RELA,也就是说它是一个重定位表,用于链接在处理目标文件时

    1.2K30

    嵌入式软件开发必知必会

    BSS的大小从可执行文件得到,然后链接得到这个大小的内存块,紧跟在数据后面。当这个内存区进入程序的地址空间后全部清零。包含数据和BSS的整个区段此时通常称为数据区。...我们以ARM嵌入式Linux系统为例,嵌入式系统在编译链接的过程中会通过一个链接脚本的东西,告诉链接,把输入的程序文件的各个放到输出的文件中区,然后控制各个在内存的布局,这样程序在运行时就有地址空间布局...我们来看一个简单的连接脚本:test.lds 1//指定程序的输出格式 2//大端、小端 3OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", 4...(2)半字(Half-Word):在ARM体系结构(32位机),半字的长度是16位,而在8位/16位处理体系结构,半字的长度与字的长度一致。...(5)汉字:一个汉字由两个字节组成,如“你”,在其它编码情况下,汉字可能也由三个字节组成。

    96440

    可执行文件的组成

    大家好,又见面,我是你们的朋友全栈君。 在 ADS 下,可执行文件两种,一种是.axf 文件,带有调试信息,可供 AXD 调试工具使用.另一种是.bin 文件,可执行的二进制代码文件。...此时可执行文件一 般由两部分组成:分别是代码和数据。代码又分为可执行代码(.text)和只读数据(.rodata), 数据又分为初始化数据(.data)和未初始化数据(.bss)。...在 ADS 下对可执行代 码各段一个名称: | … | +————-+———– | .bss | ZI +————-+– 数据 | .data | RW...在 RAM 的分布如下: | … | +————-+– ZI 结束地址 | ZI | +————-+– ZI 起始地址 | 保留区 2 | +————...-+– RO 起始地址 | … | 装载后 所以装载过程必须完成把执行文件的各个从存储介质上搬到 RAM 指定的位置。

    64620
    领券