我有一个二进制文件,具体取决于几个共享库,除了一个只读表外,我想生成一个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