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