jjzjj

c++ - 常量对象不在 rdata/rodata 部分

我无法强制msvc10将我的const对象放入.rdata部分。它总是以.data结尾,完全初始化(意味着没有动态初始化/运行时构造函数执行)。(使用“发布”版本的标准项目设置编译)。我不明白为什么以下代码不能将“obj1”放入.rdataPE部分:typedefstruct_Struct1{intm1;_Struct1(intp1):m1(p1){};_Struct1(){};}Struct1;classClass1{public:Class1(){};Class1(intp1,intp2):m1(p1),m2_struct(p2){};intm1;Struct1m2_struct;

c++ - 如何阻止 g++ 链接不需要的异常处理代码?

我正在使用为arm-eabi编译的GCC/G++开发嵌入式应用程序。由于资源限制,我试图禁用标准C++异常处理。我正在用“-fno-exceptions”编译代码-nostartfiles-ffreestanding”。当一个类的全局实例存在,并且该类包含另一个类的实例作为成员时,就会链接到很多异常处理代码。这不会太糟糕,除了它也带来了在很多stdio的东西中,比如printf、fopen、fclose和其他FILE函数。此应用程序没有文件系统,即使有,这些函数也会浪费太多代码空间。我知道,即使使用-fno-exceptions,G++也会在使用异常的operatornew中链接,因为

STM32的.map文件中的.bss、.data、.text、.rodata的区别及存放位置

STM32中有flash和ram,属于一整块内存中的不同位置,只是地址不同。flash的数据掉电后不会消失,ram的数据在掉电后会丢失(个人理解,数据也不是掉电丢失,而是上电的时候被初始化导致数据丢失)。.bss段:用来存放未被初始化的全局变量和静态变量(全局和局部都是,初始化为0的好像也会被放在这里).data段:用来存放已初始化的全局变量和静态变量.text段:用来存放程序代码.rodata段:用来存放常量和字符串常量等(const或者格式化打印时候的字符串等)堆、栈STM32中的堆栈是在启动文件中配置的空间大小,位于ram,是跟在.data段和.bss段后面的一块空间。在STM32中,通

c - GCC:为什么常量变量没有放在 .rodata 中

我一直相信GCC会将staticconst变量放置到.rodata段(或放置到.text段以进行优化)的ELF或此类文件。但好像不是这样的。我目前在装有GNU/Linux的笔记本电脑上使用gcc(GCC)4.7.020120505(prerelease)。它确实在.bss段中放置了一个静态常量变量:/**thisisa.c,andinitsgeneratedasmfilea.s,thefollowinglinegives:*.comma,4,4*whichwouldplacevariableain.bssbutnot.rodata(or.text)*/staticconstinta;i

c - GCC:为什么常量变量没有放在 .rodata 中

我一直相信GCC会将staticconst变量放置到.rodata段(或放置到.text段以进行优化)的ELF或此类文件。但好像不是这样的。我目前在装有GNU/Linux的笔记本电脑上使用gcc(GCC)4.7.020120505(prerelease)。它确实在.bss段中放置了一个静态常量变量:/**thisisa.c,andinitsgeneratedasmfilea.s,thefollowinglinegives:*.comma,4,4*whichwouldplacevariableain.bssbutnot.rodata(or.text)*/staticconstinta;i

c++ - g++编译错误: `.rodata' can not be used when making a shared object; recompile with -fPIC

我正在使用命令:g++--std=c++11-fPIC-Iincludesparser.cpplib/main-parser.olib/lib.a在Debian9上编译C++程序。但我收到以下错误消息:/usr/bin/ld:lib/lib.a(csdocument.o):重定位R_X86_64_32反对'.rodata'制作共享对象时不能使用;使用-fPIC重新编译/usr/bin/ld:最终链接失败:输出中不可表示的部分collect2:错误:ld返回1个退出状态我已经看到了线程:Compilationfailswith"relocationR_X86_64_32against`.

c++ - g++编译错误: `.rodata' can not be used when making a shared object; recompile with -fPIC

我正在使用命令:g++--std=c++11-fPIC-Iincludesparser.cpplib/main-parser.olib/lib.a在Debian9上编译C++程序。但我收到以下错误消息:/usr/bin/ld:lib/lib.a(csdocument.o):重定位R_X86_64_32反对'.rodata'制作共享对象时不能使用;使用-fPIC重新编译/usr/bin/ld:最终链接失败:输出中不可表示的部分collect2:错误:ld返回1个退出状态我已经看到了线程:Compilationfailswith"relocationR_X86_64_32against`.

c++ - 减小 .rodata 的大小

我正在Gentoo中为ARMCortexM3(MapleMini)交叉编译C++,但在链接elf文件时似乎遇到了内存资源问题/usr/libexec/gcc/arm-none-eabi/ld:build/maple_mini.elfsection`.rodata'willnotfitinregion`rom'/usr/libexec/gcc/arm-none-eabi/ld:region`rom'overflowedby1508bytes这个帖子是关于如何减小.rodata内容的大小,从而能够完成elf文件的链接的问题。我已经剥离了包含的代码,并且正在使用以下相关选项进行编译。CXXF

c++ - 虚拟析构函数将对象移出 rodata 部分

我有大量使用constexpr构造函数构造的静态常量对象,因此它们会立即存储在最终二进制文件中,而无需任何构造函数调用。由于我在低RAM系统(STM32MCU)上工作,我想减少这些对象的内存占用,因为它们是常量,所以将它们存储在.rodata部分。编译器毫无问题地解决了这个问题。但是,现在我向基类添加了一个虚拟析构函数以删除编译器警告,对象存储在.data部分。当然,我可以使用一些#pragma专门删除基类的编译器警告并删除虚拟析构函数,但我想知道是否有更清晰的解决方案。展示问题的极简主义代码:classObject{intvalue;public:constexprObject(in

linux - .rodata 部分加载到可执行页面

出于好奇,我今天尝试运行这段代码(使用gcc-m321.c编译):intmain(void){//EBistheopcodeforjmprel/8//FEishexfor-2//Sothisisessentiallyaninfiniteloop((void(*)(void))"\xEB\xFE")();}...成功了!没有段错误,程序(正确?)进入无限循环。查看反汇编(objdump-da.out),您可以看到调用...地址0x8048480中的任何内容:080483d6:....80483e7:b880840408mov$0x8048480,%eax80483ec:ffd0call*
12