LINUX.ORG.RU

Обращение к глобальной переменной относительно instruction pointer

 ,


0

3

Привет. Дело такое, сложно описать в заголовке.

Есть какая-то структура (написано на C). Пусть такая

struct my_struct {
    int a;
    int b;
    struct my_struct *next;
}

И есть указатель на структуру.

extern struct my_struct *all_structs;

Нужно содержимое all_structs->b поместить в регистр RSP, что делается из .S файла

movq all_structs,%rax
mov  4(%rax),%rsp

Мне теперь нужно, чтобы доступ к all_structs->b был как в position independent коде, т.е. без захардкоженых абсолютных адресов.

Я поэксперементировал и сделал так (я нубас, как надо не знаю)

movq all_structs@GOTPCREL(%rip), %rax
movq (%rax), %rax
mov  4(%rax), %rsp

Оно заработало. Я вот только не понял смысл инструкции movq (%rax),%rax. Разве в rax уже не будет того, куда указывает all_structs?

И да, не очень вкурил, чем name@GOTPCREL(%rip) отличается от name(%rip)? Разве во втором случае GOT не используется?

rip указывает на текущую инструкцию в коде. Данные будут совершенно в другом сегменте с другим адресом. Да, за каким хреном ты в rsp что-то суешь? Это указатель на верхушку стэка.

hateyoufeel ★★★★★ ()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

rip указывает на текущую инструкцию в коде. Данные будут совершенно в другом сегменте с другим адресом

Никогда не слышал про адресацию относительно instruction pointer'а? Почитай статью в википедии https://en.wikipedia.org/wiki/X86-64#Architectural_features К тому же я нашел милую статью в бложике по теме http://www.mindfruit.co.uk/2012/06/relocations-relocations.html

А сделать, что я хочу можно так, оказывается:

movq  all_structs(%rip), %rax
movq  4(%rax), %rsp

В SystemV x86-64 ABI приводится такой пример place independent кода для dst[0] = src[0] (массивы int)

movl src(%rip), %eax
movl %eax, dst(%rip)

или так

movq src@GOTPCREL(%rip), %rax
movl (%rax), %edx
movq dst@GOTPCREL(%rip), %rax
movl %edx, (%rax)

Да, за каким хреном ты в rsp что-то суешь?

Чтобы инициализировать стек

pr0n_actor ()
Ответ на: комментарий от LongLiveUbuntu

У тебя такая реакция на всё, что тебе непонятно?

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.