内容简介:翻译自:https://stackoverflow.com/questions/33760923/using-symbol-end-in-g-leads-to-a-segmentation-fault
考虑以下c源代码:
int _end[1050]; int main() { for (int i = 0; i < 1050; i++) _end[i] = 0; return 0; }
编译行:g main.cpp -o main -O0
在Ubuntu 14.04下使用gcc-4.8.4和clang-3.6.0时,运行此代码会导致分段错误.奇怪的行为是符号_end指向静态分配的数组_end的末尾,而不是它的开头.如果我们用end_替换_end,一切正常.
此外,如果我们要求gcc通过提供-S命令行参数输出汇编代码,则带有“_end”的版本与具有任何其他数组名称的版本之间没有显着差异:
$g++ main.cpp -o main.s -O0 -S $g++ main2.cpp -o main2.s -O0 -S $diff main.s main2.s 1,2c1,2 < .file "main.cpp" < .globl _end --- > .file "main2.cpp" > .globl end_ 5,7c5,7 < .type _end, @object < .size _end, 4200 < _end: --- > .type end_, @object > .size end_, 4200 > end_: 25c25 < movl $0, _end(,%rax,4) --- > movl $0, end_(,%rax,4)
但是如果我们使用objdump来转储可执行文件并对它们运行diff,我们将会看到在_end版本中使用的地址比所需的地址多4200 = 4 * 1050字节:
$g++ main.cpp -o main -O0 $g++ main2.cpp -o main2 -O0 $objdump -d main >main.dump $objdump -d main2 > main2.dump $diff main.dump main2.dump 2c2 < main: формат файла elf64-x86-64 // "File format" in Russian --- > main2: формат файла elf64-x86-64 123c123 < 4004ff: c7 04 85 c8 20 60 00 movl $0x0,0x6020c8(,%rax,4) --- > 4004ff: c7 04 85 60 10 60 00 movl $0x0,0x601060(,%rax,4)
据我所知,gcc编译器可能会根据需要处理以下划线开头的变量,i.即在代码中使用这些符号是一种不好的做法.但我的问题是:这里到底发生了什么?为什么_end被替换为已分配数组末尾的地址?如果我们使用“-S”命令行参数,为什么没有区别,但创建的二进制文件实际上有区别?在这种情况下,gcc和clang的表现并不一样,这对我来说也很奇怪.
Note: On some systems the names of these symbols are preceded by
underscores, thus: _etext, _edata, and _end.
翻译自:https://stackoverflow.com/questions/33760923/using-symbol-end-in-g-leads-to-a-segmentation-fault
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- macos – dyld:惰性符号绑定失败:未找到符号:_PQsetErrorContextVisibility
- 嵌入式C语言自我修养 09:链接过程中的强符号和弱符号
- Scala中的符号
- “Bug-O” 符号
- 简单理解符号执行技术
- GCC 符号表小结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
PHP Web 2.0开发实战
泽瓦斯 / 苏金国 / 人民邮电出版社 / 2008-10-1 / 59.00元
本书通过一个完整的Web 2.0应用——带有动态图库、搜索和地图功能的博客系统详细介绍了Web开发的全过程。首先讨论了Web应用的规划与设计,然后逐章实现各个具体特性,包括网站主页、用户主页、用户注册页面、账户登录和管理页面、用户博客系统、网站搜索以及应用管理等,最后介绍部署和维护。 本书适合中、高级的PHP程序员阅读。一起来看看 《PHP Web 2.0开发实战》 这本书的介绍吧!