Позиционно-зависимый тип данных в разделе кода 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

0 ответов

Другие вопросы по тегам