关于 c 的一个问题不理解

2019-07-29 11:10:22 +08:00
 fvckDaybyte2
环境:最新 mac os 以及自带的 gcc 环境
如下代码中有一个全局变量 int a[30]
'''
#include <stdio.h>
int a[30];
int main() {
printf("hello world");
}
'''
如果吧 int a[30]; 注释掉,编译后可执行文件的大小是 8432byte ;
如果不注释,可执行文件大小是 8456byte ;
如果改成 int a[30]={1,2,3...30};,可执行文件大小依然是 8456byte ;
已知 int 的在 mac 下大小是 4byte,int[30]的大小应该是 120byte,为何后两种情况可执行文件只增加了 24byte ? a 是记录在 data 段还是 bss 段?
谢谢解答
2660 次点击
所在节点    程序员
26 条回复
ShangShanXiaShan
2019-07-29 14:51:58 +08:00
@menyakun 我没理解 “其他文件可以修改这个数组的值” 是什么意思。其他文件指的是其他源码文件?如果是,那么其他文件对这个数组的引用应该也是发生在运行时吧?这样子的话跟链接时是否初始化这个数组并没有多大的关系。

@takeoffyoung 只要对数组的一个成员进行初始化并且值不为 0,那么该数组将被放置在 data 段,data 段的内容会被写到可执行文件中。
menyakun
2019-07-29 15:08:36 +08:00
@ShangShanXiaShan 对,是我理解岔了。bss 段只是一个对可执行文件大小的优化处理,bss 段和 data 段的变量在汇编代码生成的时候是一样的
fvckDaybyte2
2019-07-30 18:23:54 +08:00
@wangyaominde 请教下,这个是怎么弄出来的,是用楼上的 objdump 吗
fvckDaybyte2
2019-07-30 18:26:35 +08:00
@zealot0630 objdump -t data_bss_test_0

data_bss_test_0: file format Mach-O 64-bit x86-64

SYMBOL TABLE:
0000000100000000 g F __TEXT,__text __mh_execute_header
0000000100000f60 g F __TEXT,__text _main
0000000000000000 *UND* _printf
0000000000000000 *UND* dyld_stub_binder

看得不是很懂😂
wangyaominde
2019-07-31 10:25:39 +08:00
@fvckDaybyte2 直接 gcc -S 生成.s 的汇编文件
fvckDaybyte2
2019-07-31 10:41:26 +08:00
@wangyaominde 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/587075

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX