如何将.text部分分隔成Linux ELF中4K对齐的地址(How to separate .text section into a 4K aligned address in Linux ELF)
是否可以将.text分隔成4K对齐的页面。 例如,我编写了一个简单的程序并使用readelf -a a.out来转储节标题:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
... ...
[11] .init PROGBITS 00000470 000470 000023 00 AX 0 0 4
[12] .plt PROGBITS 000004a0 0004a0 000060 04 AX 0 0 16
[13] .text PROGBITS 00000500 000500 000342 00 AX 0 0 16
[14] .fini PROGBITS 00000844 000844 000014 00 AX 0 0 4
如何将.text放入4K对齐的页面(例如,Addr for .text是0x1000)?
谢谢!
is it possible to separate the .text into the 4K aligned pages. For example, I wrote a simple program and used readelf -a a.out to dump the section headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
... ...
[11] .init PROGBITS 00000470 000470 000023 00 AX 0 0 4
[12] .plt PROGBITS 000004a0 0004a0 000060 04 AX 0 0 16
[13] .text PROGBITS 00000500 000500 000342 00 AX 0 0 16
[14] .fini PROGBITS 00000844 000844 000014 00 AX 0 0 4
How can I put .text into a 4K aligned page (e.g., Addr for .text be 0x1000)?
Thank you!
原文:https://stackoverflow.com/questions/42685750
更新时间:2020-01-07 15:49
最满意答案
负责发布问题的工具是ld(1) (链接器)它有一个完整的手册,描述用于对齐页面和创建最终程序的可编写脚本语言。 只需阅读该手册(我指的是ld手册,而不是手册页)
一旦你读完了,你可以创建一个miniscript文件,它基于标准的linux脚本,强制*(.text)段被页面对齐,并用它来链接你的程序。
The tool responsible of the issue you post is ld(1) (the linker) It has a complete manual describing the scriptable language used to align pages and create the final program. Just have a read to that manual (I'm referring to the ld manual, not the manual page)
Once you have read it, you can create a miniscript file that, based on the standard linux script, forces *(.text) segments to be page aligned and use it to link your program.
2017-03-09
相关问答
机械硬盘需要,机械硬盘如果不考虑这个会导致性能大滑坡,无论什么系统都一样。 固态硬盘的话其实更推荐往大点设置,减少读写次数更保护硬盘嘛。
1 4K对齐对SSD效果影响很大,原因是文件系统下,logical 4K与physica 4K起始位置不一样,导致对SSD写的时候,横跨两个page,每个page都新增加了读出又修改,存入的过程。 2 linux要做到4K对齐,内核版本要在2.6.34以上。请去http://www.kernel.org/pub/linux/kernel/ 下载对应的压缩包升级内核 3. 升级好或者你的内核版本符合条件,用fdisk -b 4096分区。分区完后,用fdisk -lu查看, Sector size(
...
多谢 亲测可用!还有个问题,esp分区需要4k对齐吗,分区助手貌似操作不了esp分区
4KB对齐这个问题来源于微软的NT5.X的操作系统里的NTFS 5.X的存储规范,和Linux没关系的
要提取.text部分,您需要在二进制文件中复制从0x440( Offset )地址开始的0x182( Size )字节。 忽略0x400440( Address )值,它与文件地址无关,它是RAM内存中的地址,您的.text部分将由loader加载 。 来自ELF格式规范 : sh_addr :如果该部分将出现在进程的内存映像中,则该成员给出该部分的第一个字节应该驻留的地址。 否则,该成员包含0。 Align值实际上是十进制,而不是十六进制。 所以它是16,而不是0x16。 对齐意味着段地址必须是
...
所以你的意思是stdout和stderr应该总是在.bss中的相同内存地址 从.bss开始到stdout和stderr的偏移量是在静态链接时确定的。 .bss的起始地址受ASLR(堆放置随机化)的约束。 因此,对于给定的二进制文件, stdout的地址可能会在运行之间发生变化。 IDA pro如何知道.bss中的这个项目是stdout还是stderr 它可以知道的唯一方法是通过符号表。 您应该在以下输出中看到它: readelf -Ws ./a.out | egrep 'stdout|stderr
...
在运行时,这些部分不重要,只有程序头中的PT_LOAD段。 ELF规范也非常灵活,但一些加载器对它们可以处理的PT_LOAD段有限制。 以这种方式分解代码和数据的原因可能在于,该体系结构仅支持有限范围的PC相对寻址,并且需要用于加载大多数常量的常量池(因为通过立即构建它们太昂贵)。 拥有尽可能少的大常量池是有吸引力的,因为它会导致改进的数据和指令高速缓存利用率(而不是高速缓存不正确的类型的内存,并且永远不会使用),但是如果代码大小超过了可以直接解决的问题。 At run time, the sec
...
负责发布问题的工具是ld(1) (链接器)它有一个完整的手册,描述用于对齐页面和创建最终程序的可编写脚本语言。 只需阅读该手册(我指的是ld手册,而不是手册页) 一旦你读完了,你可以创建一个miniscript文件,它基于标准的linux脚本,强制*(.text)段被页面对齐,并用它来链接你的程序。 The tool responsible of the issue you post is ld(1) (the linker) It has a complete manual describing
...
看起来这是由于binutils 2.27将PowerPC目标的默认页面大小增加到64k,导致嵌入式平台上的二进制文件膨胀。 这里有关于crosstool-NG github的讨论。 使用--disable-relro配置binutils可以改善一些事情。 您还可以在编译时将-Wl,-z,max-page-size=0x1000到gcc。 It looks like this is due to binutils 2.27 increasing the default page size of Po
...
ELF标题应包含入口地址,该地址不一定与.text区域中的第一个地址相同。 使用objdump -f查看文件的入口点是什么 - 它将被称为“起始地址”。 这里描述了格式 - 您应该使用program headers而不是用于将ELF图像加载到内存中的section headers (我怀疑有30个程序头),并且入口点将由ELF中的e_entry字段描述头。 The ELF header should include the entry address, which is not necessari
...