- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是我的链接描述文件:
ENTRY(__startup)
SECTIONS
{
. = 0x0000;
.text : { *(.text) }
. = . + 0x4000;
.rodata :
{
*(.rodata)
*(.rodata.*)
}
.bss : { *(.bss) }
.data : { *(.data) }
}
足够简单。但是,当所有目标文件都链接在一起并且我查看可执行文件的段映射时,我得到以下信息:
Elf file type is EXEC (Executable file)
Entry point 0x0
There are 6 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0xfffff034 0xfffff034 0x000c0 0x000c0 R 0x4
LOAD 0x000000 0xfffff000 0xfffff000 0x000f4 0x000f4 R 0x1000
LOAD 0x001000 0x00000000 0x00000000 0x01a18 0x01a18 R E 0x1000
LOAD 0x002a18 0x00005a18 0x00005a18 0x00038 0x00038 R 0x1000
LOAD 0x002a50 0x00005a50 0x00005a50 0x0010c 0x0010c RW 0x1000
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0
Section to Segment mapping:
Segment Sections...
00
01
02 .text
03 .rodata .rodata
04 .bss .bss .data
05
对程序执行 objdump 也会显示两个 .rodata 部分。我运行的系统是 ubuntu 16.0.4,我的编译器是 gcc(我使用的是 LD,GNU 链接器)。
有谁知道为什么编译会产生两个同名的输出段?有没有办法强制它成为一个?这完全有可能不仅仅是关于命令语言脚本的一般性问题,但由于我无法显示我正在使用的代码库,我仍然认为向 Stack Overflow 上的好人提问不会有什么坏处。
最佳答案
LD 链接器的默认行为似乎是根据存储在只读存储器中的常量所需的对齐方式分配不同的 .rodata 部分。有关详细信息,请参阅此处:
关于linux - 为什么有多个 .rodata 段被映射到 LOAD 段,而链接描述文件中只指定了一个 .rodata 输出段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47897140/
例如当我有: const char mesg [] = "Hello World"; 它直接放在 .rodata 但是当我有: const char* mesg = "Hello World"; 直接
这是我的链接描述文件: ENTRY(__startup) SECTIONS { . = 0x0000; .text : { *(.text) } . = . + 0x4000;
我正在尝试为没有虚拟内存(或者更准确地说是操作系统)的机器编写一个 C 程序,并且我在 .rodata 部分,或者更准确地说是那里的东西遇到了一些困难。出现的问题是,尽管在链接期间这些节位于明确定义的
出于好奇,我今天尝试运行这段代码(使用 gcc -m32 1.c 编译): int main(void) { // EB is the opcode for jmp rel/8 //
我正在尝试使 .rodata 部分位置与其关联的函数内存位置保持一致。我正在使用带有 STM32L4A6 微 Controller 的 GNU 编译器/链接器、裸机、plain-jane c。 我有一
我已经为我的问题创建了一个最小示例。在 c 文件中,我初始化了一个包含 16 个元素的数组。然后我用数组指针及其大小作为参数调用一个函数。该功能本身有效,我已经使用反汇编文件验证了这一点。堆栈指针初始
我不得不完全改写这个问题及其标题,因为我的初步分析结果是错误的(感谢所有提示和建议!)。问题的旧标题是: GCC -O3 打乱二进制文件并产生数据垃圾 事实证明它与优化级别无关,我也不确定数据是否是垃
我编译了一个 Hello World C 文件,只需要其中的一个部分(只有 hello world 函数)。 编译后的文件格式为 elf32-i386,包含 4 个部分:.rodata、.text.h
目标是将大量常量数据放入 .rodata 部分,以允许从其他翻译单元访问它。据我所知,如果声明为 static const,GCC 会将数据放入只读部分。但是这样就不可能在其他文件中声明为extern
嘿 friend 我陷入严重的链接错误,我收到这样的错误 referenced in section .rodata' of xxx defined in discarded section .tex
在共享库 (linux x86_64) 的 readelf --segments 输出中,前几个程序头是: Program Headers: Type Offset
我正在 Gentoo 中为 ARM Cortex M3 (Maple Mini) 交叉编译 C++,但在链接 elf 文件时似乎遇到了内存资源问题 /usr/libexec/gcc/arm-none-
我有大量使用 constexpr 构造函数构造的静态常量对象,因此它们会立即存储在最终二进制文件中,而无需任何构造函数调用。 由于我在低 RAM 系统(STM32 MCU)上工作,我想减少这些对象的内
C语言中的代码 char *c = "Hello world!"; 在 rodata 中存储 Hello world!\0 并使用指向它的指针初始化 c。我怎样才能用字符串以外的东西来做到这一点? 具
所以测试平台是Linux 32位 我用gcc生成一个quickSort的obj文件是这样的: gcc -S quickSort.c 并且生成的quickSort.o是一个可重定位的ELF: #file
我已经看到 .rodata 和 .rdata 都被用作段。我应该使用哪一个,它们之间有什么区别? 最佳答案 RODATA 用于 ELF并且 RDATA 用于 COFF . Mach-O 中最接近的等价
尝试在 x86 AT&T 程序集中编译简单的字符串大小写交换函数时遇到此错误。 我尝试查看其他出现此错误的问题,但没有一个足够相似来帮助解决我的情况。大多数人都在不同的库和文件中处理事物,但这里的情况
我读了c++11 faq并找到这句话: Typically we want the compile-time evaluation guarantee for global or namespace
我有“const char *x”变量,编译后它应该分配在 rodata 区域中。但是当我看到变量 x 正在某个数据区域中分配时。任何人都可以告诉是否有任何命令使 const 变量在 rodata 区
在我的 x86-64 内核中,我试图将 .rodata ELF 部分映射为只读。但是所有的字符串文字都存储在特定于文件的部分中,例如.rodata.str1.8。 GCC 是否有任何选项可以将所有字符
我是一名优秀的程序员,十分优秀!