关于“.rodata.str1.4”的连接(link)问题
【问题描述】
最近在写一些嵌入式底层相关的程序,有如下程序段(编译器为arm-linux-gcc 3.4.1):
while(1)
{
unsigned char* s="abcd";
uart0_puts(s);
}
但在编译的时候出现了如下问题:
/usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/bin/ld: section .rodata.str1.4 [00000080 -> 0000008c] overlaps section .text [00000000 -> 0000044f]
【问题分析】
这个 .rodata.str1.4 是 -O2 优化时才出现的,不带优化选项时没有。在google上找到了如下一些资料:
Sections like .rodata.str1.4 are generated by gcc to support merging of duplicate constants and strings by ld. Older gcc's won't do this, nor will a newer gcc built for a system without the requisite ld support. it could be a matter of gcc versions. Apparently, gcc versions prior to 3.1.x didn't generate .rodata.strx.y sections.
大意为: .rodata.str1.4 是gcc为了支持ld合并重复的常量和字符串而产生的。老版本的gcc不会产生这个段,如果ld不支持,新版本的gcc也不会产生这个段,这是一个gcc版本问题。显然,3.1.x版本前的gcc不会产生 .rodata.strx.y段。
【解决办法】
在原来的连接脚本里边没加上 .rodata.str1。比如:
SECTIONS
{
. =0x00000000;
.text :
{
*(.text)
*(.rodata.str1.4)
*(.rodata)
}
. =ALIGN(32);
.data :
{
*(.data)
}
. =ALIGN(32);
__bss_start__ = .;
.bss :
{
*(.bss)
}
__bss_end__ = .;
}
【其他】
如果没有在在连接脚本里边加上 .rodata.str1.4 还可能出现如下错误:
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/bin/ld: error: no memory region specified for loadable section `.rodata.str1.4'
【参考资料】
http://telltruth.blogbus.com/logs/15705483.html
http://blog.chinaunix.net/uid-121788-id-2955078.html
http://blog.21ic.com/user1/2983/archives/2008/53972.html
分享到:
相关推荐
(3).rodata,只读段落;(4).text,正文段,即代码;(5).init,初始化段落; 虚拟内存具体如下:(1)kernel map;(2)栈;(3)IO缓冲区;(4)堆;(5).bss;(6).data;(7).rodata;(8).text;(9).init;(10)不可读。
利用sharepoint2010中的jsgrid制做的甘特图
.TEXT:{*(.TEXT)} .DATA:{*(.DATA)} .RODATA:{*(.RODATA)} .BSS:{*(.BSS)}}程序运行图如下:汇编
arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^ 链接脚本的主要目的是描述输入文件中的段如何被映射到输出文件... .rodata ALIGN(4) : {*(.rodata*)} // 常量数据 ro: read only .data ALIGN(4) : { *(.data) }
/usr/bin/ld: libboost_python.a(from_python.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC libboost_python.a: could not read ...
命令: objdump -D test > test1.txt objdump -CS -s -j .rodata test > test.txt
在现代操作系统中,可以将一段内存空间设置为“读写数据”、“只读数据”等等多种属性,一般编译器会将"whatever"字面量放到像".rodata"这样的只读数据
部门名称使用说明存取权限.text 组装说明rx .rodata 只读数据r-- .data 数据rw- .bss 未初始化的数据rw- 表1:ELF文件中最常用部分的摘要。 .text部分包含可执行代码,而.rodata , .data和.bss部分包含各种形式的...
.rodata:只读数据。printf中的格式串,或者开关语句的跳转表。data:已初始化的全局变量。bss:未初始化的全局变量。symtab:符号表。注意:1、如果定义一个全局变量,int i = 0;它被初始化为0,但是,它却不是放在...
新能源汽车 通信技术 物联网 硬件工程师 文档
你知道bss,data,text,rodata,堆,栈,常量段等区别?.docx
重新编译器代码中的异常将延迟到运行时,这样就不需要支持来自.rodata的egbogus“指令”。 检查清单 X86的执行状态: “你好,世界!” 编译并运行 (8/14) 测试套件可以编译并运行 测试套件可以编译并与MSVC...
str r2, [r1, #oNFCONF] ldr r2, [r1, #oNFCONF] bic r2, r2, #0x800 @ enable chip str r2, [r1, #oNFCONF] mov r2, #0xff @ RESET command strb r2, [r1, #oNFCMD] mov r3, #0 @ wait nand1: add r3, r3, ...
android相机适配libcamera_client.so,用objdump导出信息后,自己用vs2013编写一个小程序,用来读取rodata里的CameraParameters
基于Autosar架构,RH850芯片的内存分配指令及描述,如# pragma ghs section rodata等
const unsigned int ICACHE_RODATA_ATTR fakePwm[]={ 0x00000010, 0x00000410, 0x00400410, 0x00400C10, 0x00500C10, 0x00D00C10, 0x20D00C10, 0x21D00C10, 0x21D80C10, 0xA1D80C10, 0xA1D80D10, 0xA1D80D30, 0xA1...
前提条件支持的设备:Pixel(Tested),Pixel 2 XL,Pixel 2,Pixel XL,Pixel C,Nexus 6P,Nexus 5X android-8.1.0_r1 == OPM1.171019.011根访问权限将CONFIG_DEBUG_RODATA设置为false,以便您可以重写syscall表。...
先决条件支持的设备:Pixel(已测试),Pixel 2 XL,Pixel 2,Pixel XL,Pixel C,Nexus 6P,Nexus 5X android-8.1.0_r1 == OPM1.171019.011 根访问权限将CONFIG_DEBUG_RODATA设置为false,以便可以重写syscall表。...
Smilehax-IIe 介绍 这是3DS Smilebasic 3.6.0 USA / EUR(和3.3.2 JPN)的新主要漏洞。 目前,美国/欧元是最新的应用,而JPN可以从3.6.3-> ... TIME $ [0] / DATE $ [0]实际上指向rodata中的某个位置,并且过大的下标
0x100000 - Binary, rodata 0x200000 - Stack, heap 一次性成本高 Time spent: 239810ns (239 micros) Time spent: 237736ns (237 micros) Time spent: 236555ns (236 micros) Time spent: 238876ns (238 micros) ...