免费注册 查看新帖 |

Chinaunix

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

[其他] 帮助你阅读内核源码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-23 14:53 |只看该作者 |倒序浏览
本帖最后由 prc 于 2015-11-26 16:34 编辑

在阅读大型C/C++工程源码的过程中常常遇到以下问题
  • 源码中存在的条件编译语句;有的甚至很长,超出了屏幕的高度
  • 工程中存在大量同名的符号
这些都会打断思维过程,使得我不得不停下来花费时间精力去判断哪个代码块为“真”,哪个为“假”。 CL针对这个问题提供了一套简单的解决方案,在编译过程中模仿预处理器计算条件编译语句的值,然后删除“假”的代码块, 仅剩下有效代码。

运行环境
  • Ubuntu (其它的linux发行版应该也可以,但是没做过测试)
  • Python 2
  • Gnu awk
  • Bash
  • Gnu make

运行
以linux为例,依次执行下列命令:
  • git clone https://github.com/panruochen/codeless.git
  • 编译CL,假设代码目录为${CL_DIR}
  • make defconfig CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH}
  • ${CL_DIR}/y-Make --yz-cc=${CROSS_COMPILE}gcc --yz-postprocess=${YOUR_DIR} --yz-server-addr=${ANY_VALID_PATH} -j8
--yz开头的参数传给CL的;--yz-cc表示编译器,--yz-postprocess表示先编译后清理源文件;一般来说只需要这两个参数就可以了。 --yz-server-addr表示启动server并指定server的地址(该地址可以是任何有效的路径)。启动server可以减少临时文件的大小, 并对程序的性能有轻微的改善。而其它的参数如-j8则是传给make的。
编译完成后,在linux目录下会发现大量的.bak文件,它们都是被清理过的同名的.c/.cpp/.h文件的备份。通过比较.bak与原文件,可以发现源文件中的条件编译代码已经被删除:

为了方便恢复代码,建议使用git或者其它的版本管理工具。
为了保证目标文件vmlinux与源代码的一致性,还需要再次编译linux。

限制
只能使用下列编译器(其它的编译器未经测试)
  • gcc
  • clang
并且${CROSS_COMILE}gcc展开后只能包含字母,数字,下划线_和减号-

副产品
${YOUR_DIR}目录下的projlist.txt列出了本次编译涉及到的所有.c/.cpp/.h文件,我们可以利用它来生成一个更精确的cscope或者ctags的数据库。
cscope -bkq -i <(tail -n +2 projlist.txt)
通过这个数据库查找可以避免大量重名的符号。


y-Make的命令行参数

  1. --yz-cc=CC                 指定编译器
  2. --yz-postprocess=DIR       开启后处理模式,并使用DIR为其工作目录
  3. --yz-save-dep=FILE         将所有依赖关系保存在文件FILE中
  4. --yz-save-cl=FILE          将所有命令行保存在文件FILE中
  5. --yz-save-condvals=FILE    将所有条件编译语句的计算结果保存在文件FILE中
  6. --yz-save-proj=FILE        将编译中所涉及到的文件保存在文件FILE中
  7. --yz-server-addr=FILE      启动server,并以FILE作为server的地址
  8. --yz-runtime-dir=DIR       指定server的工作目录为DIR;默认为/var/tmp
  9. --yz-xcc=FILE              指定FILE为parser;默认为${CL_DIR}/cl.exe
  10. --yz-server-program=FILE   指定FILE为server;默认为${CL_DIR}/cl-server.exe
复制代码
Post Process(后处理)
后处理模式是为了解决编译过程中的实际问题而引入的,即一个.c/.cpp文件有可能被多次编译。如果在编译之前清理文件(这是默认模式), 被删除掉的代码很可能在第二次编译时应该被引用,从而导致整个编译过程失败。 并且,.h文件几乎100%会被多次引用,如果未开启后处理模式,清理.h文件是不可能的。

适用范围
下列开源项目经过测试
  • linux-3.6
  • linux-2.6.27.29
  • llvm-3.5.0
  • u-boot
  • make-4.0

评分

参与人数 3可用积分 +16 信誉积分 +10 收起 理由
firocu + 10 Cool!
amarant + 10 赞一个!
Godbach + 6 很给力!

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2015-11-23 16:39 |只看该作者
回复 1# prc

感谢分享。


   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
3 [报告]
发表于 2015-11-25 14:52 |只看该作者
应该会有很多网友需要这样的工具。3x

论坛徽章:
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 [报告]
发表于 2015-11-26 14:18 |只看该作者
这个diao

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:00
5 [报告]
发表于 2015-11-28 12:05 |只看该作者
有动态 开启/关闭 功能否?
有时候确实想知道走的是哪个预处理块,但如果写死,难免会起一些纠结

论坛徽章:
0
6 [报告]
发表于 2015-11-30 19:24 |只看该作者
这个需求可以通过git完成
git checkout YOUR_FILE #恢复文件
CL_DIR/tool/cl-tool strip -f TMP_DIR/tmp.pp YOUR_FILE #清理文件
回复 5# yihect

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
7 [报告]
发表于 2015-12-01 12:46 |只看该作者
Cool!
It seems very useful!
Thanks for share!

论坛徽章:
0
8 [报告]
发表于 2015-12-10 10:17 |只看该作者
../codeless/y-Make --yz-cc=gcc --yz-postprocess=cl

我使用上面的命令处理zeromq,出现这样的异常:

../libtool: line 1:  4300 Segmentation fault      (core dumped) /home/bm186/codeless/cl.exe --yz-no-output --yz-save-dep=/home/bm186/zeromq-wangyl11/cl/depends.txt --yz-save-cl=/home/bm186/zeromq-wangyl11/cl/commands.txt --yz-save-condvals=/home/bm186/zeromq-wangyl11/cl/condvals.txt --yz-top-dir=/home/bm186/zeromq-wangyl11 --yz-cc=gcc --yz-verbose=0 "$@"

我的系统环境是
186_bm186%uname -a
Linux rhel13160 2.6.32-131.0.15.el6.x86_64 #1 SMP Tue May 10 15:42:40 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux

楼主见过这个错误吗?

论坛徽章:
0
9 [报告]
发表于 2015-12-10 11:33 |只看该作者
回复 8# hnwyllmm
这个可能是个BUG,请给出zeromq的下载路径

   

论坛徽章:
0
10 [报告]
发表于 2015-12-10 12:51 |只看该作者
回复 9# prc
github.com/zeromq/zeromq4-1  (抱歉没有URL权限)
这是官方版本的下载地址,但是我自己测试的是4.0.4版本代码
另外,我把gcc改成g++就不会core了,但是却没有发现任何结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP