linux段地址对齐,如何将.text部分分隔成Linux ELF中4K对齐的地址(How to separate .text section into a 4K aligned address in...

博客讨论了如何在Linux ELF文件中将.text段调整为4K对齐,以优化内存管理和程序性能。通过阅读ld链接器手册并创建自定义链接脚本,可以实现此目标。问题中提供了程序的section headers信息,询问如何确保.text段的地址如0x1000对齐。答案建议修改链接脚本以强制4K对齐。
摘要由CSDN通过智能技术生成

如何将.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

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值