Привет. Дело такое, сложно описать в заголовке.
Есть какая-то структура (написано на 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 не используется?