1

我正在尝试使用 -msecure-plt 进行编译,虽然编译完成得很好,但在查看内存映射时,它看起来并没有像标志实际上在做任何事情。我假设它没有做任何事情,因为 got 和 plt 部分仍处于分段中RWXP

Dump of assembler code for function main:
0x1000061c <+0>:     stwu    r1,-16(r1)
0x10000620 <+4>:     mflr    r0
0x10000624 <+8>:     stw     r0,20(r1)
0x10000628 <+12>:    stw     r31,12(r1)
0x1000062c <+16>:    mr      r31,r1
0x10000630 <+20>:    bl      0x1001096c <libfunc@plt>
0x10000634 <+24>:    mr      r10,r3
0x10000638 <+28>:    lis     r9,4096
0x1000063c <+32>:    addi    r3,r9,2048
0x10000640 <+36>:    mr      r4,r10
0x10000644 <+40>:    crclr   4*cr1+eq
0x10000648 <+44>:    bl      0x10010964 <printf@plt>
=> 0x1000064c <+48>:    li      r9,1
0x10000650 <+52>:    mr      r3,r9
0x10000654 <+56>:    addi    r11,r31,16
0x10000658 <+60>:    lwz     r0,4(r11)
0x1000065c <+64>:    mtlr    r0
0x10000660 <+68>:    lwz     r31,-4(r11)
0x10000664 <+72>:    mr      r1,r11
0x10000668 <+76>:    blr

显示/proc/<pid>/maps内存映射

00100000-00103000 r-xp 00000000 00:00 0          [vdso]
0fe40000-0ffb8000 r-xp 00000000 00:01 6285       /lib/libc-2.22.so
0ffb8000-0ffc7000 ---p 00178000 00:01 6285       /lib/libc-2.22.so
0ffc7000-0ffc9000 r--p 00177000 00:01 6285       /lib/libc-2.22.so
0ffc9000-0ffcd000 rwxp 00179000 00:01 6285       /lib/libc-2.22.so
0ffcd000-0ffcf000 rwxp 00000000 00:00 0
0ffdf000-0ffe0000 r-xp 00000000 00:01 5928       /lib/libmaintest.so
0ffe0000-0ffef000 ---p 00001000 00:01 5928       /lib/libmaintest.so
0ffef000-0fff0000 rwxp 00000000 00:01 5928       /lib/libmaintest.so
10000000-10001000 r-xp 00000000 00:01 5934       /root/main
10010000-10011000 rwxp 00000000 00:01 5934       /root/main
b7860000-b7882000 r-xp 00000000 00:01 6240       /lib/ld-2.22.so
b7890000-b7892000 rw-p 00000000 00:00 0
b7892000-b7893000 r--p 00022000 00:01 6240       /lib/ld-2.22.so
b7893000-b7895000 rwxp 00023000 00:01 6240       /lib/ld-2.22.so
bff1a000-bff3b000 rw-p 00000000 00:00 0          [stack]

这两个情节都直接跳到了一个rwx部分的中间。我是否误解了这些信息?

4

2 回答 2

1

我认为这可能是一个内核限制:参见例如https://lkml.org/lkml/2016/8/8/354 - 看起来内核以您不期望的方式映射事物,因为我理解的是历史原因。

鉴于上面的补丁是昨天发送的,它可能很快就会改变。

于 2016-08-09T03:45:15.503 回答
0

根据您的 gcc 版本,-msecure-plt如果您链​​接到的任何库也未使用-msecure-plt(包括glibc)编译,则该标志可能会被忽略。看到这个

于 2016-08-29T17:05:20.550 回答