У меня есть двоичный файл, зависящий от нескольких общих библиотек, и я хотел бы создать двоичный файл 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