PIC代码中与位置有关的数据类型部分?

时间:2018-12-27 18:18:35

标签: assembly shared-libraries relocation got

我有一个二进制文件,具体取决于几个共享库,除了一个只读表外,我想生成一个PIC二进制文件。

我希望所有代码节都能够访问此表而无需遵守.GOTPCREL。我不在乎该表驻留在哪种数据节(.bss.data等)中,但是我希望它肯定是只读的,并且可以由所有共享库直接访问和主要的二进制文件。因此,我想应该将它放入二进制文件而不是共享库之一中。

目前,我在.data.rel.ro部分中将其保存为只读,但是要访问其数据,我需要通过.GOT来获取其地址,如下所示:TABLENAME@GOTPCREL(%rip)并使用该地址然后。我要问的原因是,我想使用bt指令并为它提供表的地址,我需要有两条指令和一个临时寄存器。如果该表不可重定位,那么我可以在链接阶段提供其地址,例如:bt %REG, TABLENAME,只需要一条指令,而无需任何额外的寄存器。

这完全可以实现吗?

这是一个更具体的示例:

主程序代码:

    .text
    ### SOME CODE 
    .section     .data.rel.ro,"aw",@progbits
    .globl  MYTABLE
MYTABLE:
    .zeros  128   # my table of 128 bytes all zeros for illustration

其中一个共享库:

    .text
    .globl  myfun
    .type   myfun, @function
myfun:
    xor     %rax, %rax
    movq    MYTABLE@GOTPCREL(%rip), %rcx   ### I like to have "bt %r11, MYABLE"
    bt      %r11, (%rcx)                   ### instead of these two lines
    jb      label
    movq    $1, %rax
label:
    ret

0 个答案:

没有答案