0

我有一个依赖于几个共享库的二进制文件,我想生成一个 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
4

0 回答 0