gpt4 book ai didi

c++ - G++ 编译器在每次运行后返回相同的变量地址(即使在名称更改后)

转载 作者:行者123 更新时间:2023-12-04 08:24:06 26 4
gpt4 key购买 nike

我的假设是编译器在每次运行后都会更改变量的地址。 (它在 MSVC 中确实如此)
出于某种原因,每次运行时,我的 G++ 编译器都会返回相同的地址。

  • 即使在关闭并再次运行后,它也会返回注释地址。有什么我不知道的优化技术吗?
  • 更改变量名称后,这将返回相同的地址。

  • 想了解 MSVC 和 G++ 的区别及其背后的原因。
    #include<iostream>
    using namespace std;

    int main(){
    int b[] = {23,4,6,1,5,7,8,7};
    cout << b; //0x61fef0
    cout << endl;
    cout << &b[0]; //0x61fef0

    return 0;
    }
    注意:我使用的是 g++ (MinGW.org GCC Build-2) 9.2.0

    最佳答案

    当编译器编译目标文件时,所有地址都是相对的。然后链接器获取所有这些地址并将它们放入正确的位置。正确的地方,我的意思是操作系统期望它们在的地方。 (详细信息由平台相关链接描述文件决定)
    当您加载可执行文件时,操作系统会将您的代码(ELF 中的 .text 部分)和数据(ELF 中的 .data 和 .bss 部分)放在正确的地址,然后跳转到这些地址。
    在可执行文件中的程序分支(goto)地址可以是固定的或相对的(位置无关)。如果它们是固定的,通常可执行文件使用相同的地址。如果它们是相对的,操作系统可以将可执行文件加载到任何地址,然后它必须设置额外的蹦床代码才能正常工作。
    对于安全操作系统,请使用地址空间布局随机化 (ASLR)。在这种模式下,操作系统将随机加载东西。这使得利用安全漏洞变得更加困难。这究竟如何工作取决于平台。
    据我所知,x86 上的 Linux 使用固定地址,除非您使用 -PIE 构建分配(位置独立的可执行文件。
    希望这能让您更好地了解正在发生的事情。

    关于c++ - G++ 编译器在每次运行后返回相同的变量地址(即使在名称更改后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65356245/

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