LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 938|回复: 4

【进阶】请教 gcc 用法(Advanced)?

[复制链接]
发表于 2004-12-2 23:44:47 | 显示全部楼层 |阅读模式
最近做一个程序要求 size 尽量小,但用 objdump 的结果发现编译器将我的常量字符串(即 printf 用的各个常量字符串)放到了两个只读数据段中,分别是

  1. .rodata.str.1  (byte aligned)
  2. .rodata.str.32 (32 byte aligned)
复制代码

这个 (32 byte aligned) 的 section 就比较讨厌了,给我的文件添加了好多零字节。我又用不同的源文件测试了发现常量字符串放入 .rodata.str.1 还是 .rodata.str.32 似乎是随机的!我想 string 之类的东西对齐与不对齐有何分别呢,又不像 integer 对齐了能提高效率,所以一定要把 const string 都放到 .rodata.str.1 中!在 info gcc 中找了很多,编译用了如下参数:

  1. gcc -Wall -Wunused -Wmissing-prototypes -falign-functions=1 -falign-loops=1 -falign-jump=1 -falign-labels=1
  2. -fstrength-reduce -mcpu=pentium3 -masm=intel -fstrength-reduce -Os -s -nostdinc -fno-builtin ...
复制代码

发觉还是没有达到将常量字符串放入字节对齐的 section 这个目的,只好贴上论坛请教各位大侠,不知有何良策没有?
发表于 2004-12-3 19:57:34 | 显示全部楼层
你这个要求挺特殊的,似乎GCC没有提供对这种特性的操作。
 楼主| 发表于 2004-12-4 02:46:45 | 显示全部楼层
但是 GCC 为何“随机”的把我的常量字符串放入两个段(.rodata.str.1 和 .rodata.str.32)中呢?
发表于 2004-12-4 10:44:04 | 显示全部楼层
你误会我的意思了,我的意思是说gcc没有向程序员提供操作printf中的常量字符串的放置方法的接口。只能由编译器自行控制。
 楼主| 发表于 2004-12-4 12:11:50 | 显示全部楼层
但是我觉得应该有啊,常量字符串是一个节省 size 的办法,是不是我们在 gcc 的编译选项里还没找到呢?
否则诸如:
-falign-functions=1 -falign-jumps=1 -falign-labels=1 -falign-loops=1
又有何意义呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表