我知道它们包含trampolines。蹦床是由编译器还是链接器创建的?该部分的格式是什么(它似乎不是代码.objdump -d无法反汇编它。)?
是否有一些选项可以抑制他们的创作?
Nr Name Type Addr Off Size ES Flg Lk Inf Al
16 .tramp PROGBITS 0xxxxxxx 0xxxxx 0000xx 00 A 0 0 4
我在ELF spec找不到任何内容。
修改2012.01.30:
关于这个问题的更多情报。代码由MaxAda编译器(版本3.5.1)生成,并以某种方式连接到Ada Runtime。
引用.tramp部分的唯一符号是
4379: 080xxxxx 0 OBJECT GLOBAL DEFAULT 16 A$rts_bounce_list
构建了一个链接器映射文件,发现该符号来自:
/usr/ada/i86_3.5.1/lib/libruntime.bart.a(bounce.red_hat.o)
/usr/ada/i86_3.5.1/lib/libruntime.bart.a(ada.rts.elaboration.runtimeB) (A$rts_bounce_list)
部分(objdump)的十六进制转储产生:
Contents of section .tramp:
80xxxa8 01000000 90e70708 22e80708 01000000 ........".......
80xxxb8 24e80708 17eb0708 01000000 4cec0708 $...........L...
80xxxc8 4cee0708 01000000 4cee0708 c2f00708 L.......L.......
80xxxd8 01000000 701d0808 1f1e0808 01000000 ....p...........
80xxxe8 70400808 c6410808 02000000 ac960808 p@...A..........
80xxxf8 00000000 02000000 00000000 00000000 ................
80xxy08 02000000 00000000 00000000 03000000 ................
80xxy18 66400808 01000000 02000000 349d0808 f@..........4...
80xxy28 00000000 02000000 00000000 00000000 ................
手册完全没有用处:
Pragma TRAMPOLINE
NOTE : Pragma TRAMPOLINE is reserved for internal MAXAda use only;
it is not intended for use in user-defined code.
答案 0 :(得分:1)
完全不经意间,我想我偶然发现了答案。 蹦床部分的起源似乎是一种保护功能,特别是在CPU上没有NX位的系统中模拟写XOR执行功能。
因此,根据维基页面,蹦床部分的内容是完成该功能仿真的实际软件机制:
在具有更多功能的处理器上,例如Intel i386,W ^ X要求使用CS代码段限制作为“沙子中的线”,地址空间中的一个点,在该点之上不允许执行并且数据是位于,在其下方,允许放置可执行页面。
见1)Write XOR Execute 和2)This discussion
附录: 第7页的this pdf中也提到过。