gpt4 book ai didi

c - 为什么 gcc 在汇编中使用函数指针的相对地址?

转载 作者:行者123 更新时间:2023-11-30 18:10:51 25 4
gpt4 key购买 nike

C 源代码:

int sum(int a, int b) {    
return a + b;
}

int main() {
int (*ptr_sum_1)(int,int) = sum; // assign the address of the "sum"
int (*ptr_sum_2)(int,int) = sum; // to the function pointer
int (*ptr_sum_3)(int,int) = sum;

int a = (*ptr_sum_1)(2,4); // call the "sum" through the pointer
int b = sum(2,4); // call the "sum" by usual way

return 0;
}

汇编代码的关键部分:

lea rax, sum[rip]
mov QWORD PTR -24[rbp], rax
lea rax, sum[rip]
mov QWORD PTR -16[rbp], rax
lea rax, sum[rip]
mov QWORD PTR -8[rbp], rax

GDB执行的程序指令:

   0x5fa <sum>: push   rbp
0x5fb <sum+1>: mov rbp,rsp
0x5fe <sum+4>: mov DWORD PTR [rbp-0x4],edi
0x601 <sum+7>: mov DWORD PTR [rbp-0x8],esi
0x604 <sum+10>: mov edx,DWORD PTR [rbp-0x4]
0x607 <sum+13>: mov eax,DWORD PTR [rbp-0x8]
0x60a <sum+16>: add eax,edx
0x60c <sum+18>: pop rbp
0x60d <sum+19>: ret
0x60e <main>: push rbp
0x60f <main+1>: mov rbp,rsp
0x612 <main+4>: sub rsp,0x20
0x616 <main+8>: lea rax,[rip+0xffffffffffffffdd] # 0x5fa <sum>
0x61d <main+15>: mov QWORD PTR [rbp-0x18],rax
0x621 <main+19>: lea rax,[rip+0xffffffffffffffd2] # 0x5fa <sum>
0x628 <main+26>: mov QWORD PTR [rbp-0x10],rax
0x62c <main+30>: lea rax,[rip+0xffffffffffffffc7] # 0x5fa <sum>
0x633 <main+37>: mov QWORD PTR [rbp-0x8],rax
0x637 <main+41>: mov rax,QWORD PTR [rbp-0x18]
0x63b <main+45>: mov esi,0x4
0x640 <main+50>: mov edi,0x2
0x645 <main+55>: call rax
0x647 <main+57>: mov DWORD PTR [rbp-0x20],eax
0x64a <main+60>: mov esi,0x4
0x64f <main+65>: mov edi,0x2
0x654 <main+70>: call 0x5fa <sum>
0x659 <main+75>: mov DWORD PTR [rbp-0x1c],eax
0x65c <main+78>: mov eax,0x0
0x661 <main+83>: leave
0x662 <main+84>: ret

我认为sum label只是sum的起始地址程序-0x5fa ,所以我不明白为什么gcc不能直接使用,而是使用计算sum[rip]为此。

问题:

  1. 为什么是sum[rip]用于lea rax, sum[rip]汇编指令,而不是简单的 sum标签,例如lea rax, sum
  2. 请问 mov rax, 0x5fa指令做同样的事情吗?因为我们知道sum链接后地址:call 0x5fa <sum>指令直接使用它。

最佳答案

我相信这可能取决于您的 GCC 版本,但在我使用的 Linux 发行版上,所有内容都设置为默认为 PIC 版本。这就是位置无关代码。这对于共享库和可执行文件来说都更好,因为结果可以映射到内存中的任何位置,而不需要修复过程。由于可以应用 ASLR,因此安全性更好。

对于 x86-64,使用 PIC 不会造成重大损失,那么为什么不到处使用它呢?

关于c - 为什么 gcc 在汇编中使用函数指针的相对地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54728797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com