免费注册 查看新帖 |

Chinaunix

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

[进程管理] C符号和汇编符号怎么联系起来的呢? [复制链接]

论坛徽章:
1
天秤座
日期:2014-03-25 15:12:56
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-21 17:59 |只看该作者 |倒序浏览
0.11内核中文件Sys.h中定义了一个 fn_ptr sys_call_table[] ={}数组,在System_call.s文件中发现了  call _sys_call_table(,%eax,4); 这一句汇编 不知道C中的符号sys_call_table 和汇编中的符号_sys_call_table 有没有联系,如果有是怎么联系起来的呢?

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2014-04-21 19:34 |只看该作者
c语言编译后的二进制文件就可以看作汇编。其实可以使用objdump看看反汇编。在编译前的函数名/变量名 全都可以找到到。当然也可以被汇编文件里面访问相关函数、变量了。

论坛徽章:
1
天秤座
日期:2014-03-25 15:12:56
3 [报告]
发表于 2014-04-22 13:25 |只看该作者
回复 2# amarant
网上有种说法说。gcc编译器在导出符号前加一个"_", 所以才有汇编语言使用_sys_call_table 其实使用的是C语言中定义的sys_call_table。但是我用bojdump查看了二进制的所有导出符号,发现导出符号前并没有加“_”

   

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
4 [报告]
发表于 2014-04-22 14:07 |只看该作者
回复 3# palm008


    符号不会变的 我天天都在玩汇编

论坛徽章:
0
5 [报告]
发表于 2014-04-23 13:51 |只看该作者
本帖最后由 l4rmbr 于 2014-04-23 14:31 编辑
palm008 发表于 2014-04-21 17:59
0.11内核中文件Sys.h中定义了一个 fn_ptr sys_call_table[] ={}数组,在System_call.s文件中发现了  call _ ...


Hi, palm008,

简单说,在编译时,编译单元(每一个.c文件, .h文件在预处理阶段已经展开在.c文件里)中的所有全局符号都会保存在符号表里,最终
在链接时根据符号表解析跨单元之间的符号引用。

GCC在生成符号表时,会在每个符号前加一下划线,这个加了下划线的版本,将是在链接阶段看到的版本。GCC有两个选项可以控制这个行为:
  1. -fleading-underscore

  2. This option and its counterpart, -fno-leading-underscore, forcibly change the way C symbols are represented in the object file. One use is to help link with legacy assembly code.

  3. Warning: the -fleading-underscore switch causes GCC to generate code that is not binary compatible with code generated without that switch. Use it to conform to a non-default application binary interface. Not all targets provide complete support for this switch.
复制代码
至于为什么要这么做,不直接采用源文件中的符号名。
原因可能是早期,C刚诞生时(用来写unix), 经常要处理与汇编的互动。C源文件单独编译,汇编文件单独编译,最后再链接起来,加个下划线可以有效防止两个名字空间中变量的冲突。

论坛徽章:
1
天秤座
日期:2014-03-25 15:12:56
6 [报告]
发表于 2014-04-23 13:59 |只看该作者
l4rmbr 发表于 2014-04-23 13:51
Hi, palm008,

简单说,在编译时,编译单元(可每一个.c文件, .h文件在预处理阶段已经展开在.c文件里 ...

谢谢回复,说的很清楚。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP