免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2051 | 回复: 8
打印 上一主题 下一主题

求助:关于gcc编译选项的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-19 09:54 |只看该作者 |倒序浏览
1.在编译之后的.o文件反汇编过来发现很多的symbol名称被替换为了.Lxx,其中xx是个数字,不知道有没有什么选项可以强制要求编译的时候不做这个替换,目前使用的优化选项是-O2,不用优化选项结果也是这样的
2.想要的编译的同时生成一个反汇编文件,要求文件里C和对应的汇编都存在,有什么好办法吗

thanks

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2012-03-19 14:28 |只看该作者
1.在编译之后的.o文件反汇编过来发现很多的symbol名称被替换为了.Lxx,其中xx是个数字,不知道有没有什么选项可以强制要求编译的时候不做这个替换,目前使用的优化选项是-O2,不用优化选项结果也是这样的

http://sourceware.org/binutils/docs-2.22/as/L.html#L

2.7 Include Local Symbols: -L

这个选项可能不是你想要的。.Lxx是局部符号,是编译器内部自动生成的,你的源程序中难倒有显式的符号被替换了么?能不能举个例子?

2.想要的编译的同时生成一个反汇编文件,要求文件里C和对应的汇编都存在,有什么好办法吗

http://gcc.gnu.org/onlinedocs/gc ... ml#Code-Gen-Options

-fverbose-asm
    Put extra commentary information in the generated assembly code to make it more readable. This option is generally only of use to those who actually need to read the generated assembly code (perhaps while debugging the compiler itself).

    -fno-verbose-asm, the default, causes the extra information to be omitted and is useful when comparing two assembler files.

这个选项可以生成带有详细信息的汇编文件。

论坛徽章:
0
3 [报告]
发表于 2012-03-19 14:46 |只看该作者
感谢您的回复。
1.确实是有显示的函数名被替换了,我搜索了一下貌似是gcc4.0之后的特性,把static类型的函数symbol全部替换为了Lxx这种东西,貌似是为了防止链接出错
2.这个文件貌似叫source listing,就是C文件和对应的汇编交叉着,用来debug分析问题的

其实1,2我就是需要解决同一个问题了,我们的系统需要做debug分析工具,之前用的其他编译器可以在编译的同时生成source listing这个文件,但是gcc我现在还没有找到,然后debug将单个文件反汇编过去就发现了1中的问题,很多static的函数函数名被换了。。。

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
4 [报告]
发表于 2012-03-19 18:53 |只看该作者
能不能贴出一个symbol被替换的小例子,我试试?呵呵

论坛徽章:
0
5 [报告]
发表于 2012-03-20 11:16 |只看该作者
回复 4# EricFisher

看起来公司网络没法上传图片或者附件。。。

比如说一个函数叫setA,如果声明为extern,就可以在.o文件中找到,但是声明为static,在.o文件中就找不到了,会被替换为.Lxx这种,不过可以被外部链接到
   

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
6 [报告]
发表于 2012-03-20 12:43 |只看该作者
奇怪,函数如果是static的,那么只能在该编译单元中可用,怎么可能被外部链接到?

论坛徽章:
0
7 [报告]
发表于 2012-03-20 13:26 |只看该作者
回复 6# EricFisher

比如说一个函数叫setA,如果声明为extern,就可以在.o文件中找到,但是声明为static,在.o文件中就找不到了,会被替换为.Lxx这种,不过可以被外部链接到
   
最后那句不对。。。

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
8 [报告]
发表于 2012-03-20 16:18 |只看该作者
本帖最后由 EricFisher 于 2012-03-20 16:19 编辑

我这里试了下,没有问题。
  1. $ cat test.c
  2. static void
  3. foo (void)
  4. {
  5. }
复制代码
  1. $ gcc -S test.c
  2. $ cat test.s
  3.         .file        "test.c"
  4.         .text
  5.         .type        foo, @function
  6. foo:
  7.         pushl        %ebp
  8.         movl        %esp, %ebp
  9.         popl        %ebp
  10.         ret
  11.         .size        foo, .-foo
  12.         .ident        "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
  13.         .section        .note.GNU-stack,"",@progbits
复制代码
  1. $ gcc -c test.c
  2. $ objdump test.o -d

  3. test.o:     file format elf32-i386


  4. Disassembly of section .text:

  5. 00000000 <foo>:
  6.    0:        55                           push   %ebp
  7.    1:        89 e5                        mov    %esp,%ebp
  8.    3:        5d                           pop    %ebp
  9.    4:        c3                           ret   
复制代码

论坛徽章:
0
9 [报告]
发表于 2012-03-20 21:04 |只看该作者
回复 8# EricFisher

thanks。。。可能环境不一致。。我们的gcc是某公司二次开发的,我们在windows下编译嵌入式系统。。。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP