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