2016开源开发工具大会

演讲资料参见: https://github.com/hellogcc/OSDT2016

【大会简介】
2016开源开发工具大会是由HelloGCC(www.hellogcc.org)工作组举办的年度开源技术大会。我们希望通过自由,开放,共享的方式来增进大家相互的交流。目前话题主要涉及开源工具链,开源开发工具方面。感谢演讲者为我们贡献精彩的话题 ,感谢各单位和朋友对我们的赞助和支持,欢迎大家免费报名参加。

往年活动:
*) OSDT Workshop 2015: http://www.hellogcc.org/?p=34190
*) OSDT Workshop 2014: http://www.hellogcc.org/?p=33910
*) HelloGCC Workshop 2013: http://www.hellogcc.org/?p=33518
*) HelloGCC Workshop 2012: http://linux.chinaunix.net/hellogcc2012
*) HelloGCC Workshop 2011: http://linux.chinaunix.net/hellogcc2011
*) HelloGCC Workshop 2010: http://linux.chinaunix.net/hellogcc2010
*) HelloGCC Workshop 2009: https://sites.google.com/site/hellogccworkshop/hui-yi-ri-cheng

【日程安排】

2016年10月29日(周六)
13:30-14:20 GNU工具链里的漏洞利用缓解技术 樊付强 | 腾御安基础架构安全咨询
14:20-15:10 与优秀的原创者同行——开源工具链的架构用途 武若冰 | 新设计联合创始人
15:10-16:00 用Tegra K1加速人工智能在机器人中的应用 吴伟 | 中国科学院软件研究所工程师
16:00-16:10 茶歇
16:10-16:30 支持任意数量watchpoint的建议 朱辉 | 小米电视工程师/GDB maintainer
16:30-17:20 安卓应用保护技术发展 周亚金 | 自由职业
17:20-18:10 How to use LLVM JIT 马骏 | 迪捷数原科技有限公司工程师

【大会地址】
北京万达索菲特大饭店(北京市朝阳区建国路93号万达广场C座),开源开发工具交流专场

乘车路线:
公交路线:乘坐机场巴士1线,到达大北窑(国贸),步行约590米,到达终点;

乘坐公交673,到达大北窑北,步行约710米,到达终点;

乘坐405/1/402/,到达大北窑东,步行约410米,到达终点;

乘坐627到大北窑南,步行约880米,到达终点;

乘坐683/601公交车,到达光华桥南,步行约820米,到达终点 。

地铁路线:地铁10号线或者地铁1号线,到达国贸站,步行约790米 。

【报名网址】
https://jinshuju.net/f/CZqW5v

【赞助单位】

场地支持 ChinaUnix
合作单位 20131015034226346

开源开发工具大会2016话题和赞助征集

*************************************************************************
话题和赞助征集

开源开发工具大会(OSDT2016)
中国 北京 万达索菲特大饭店
2016年10月29日(周六)下午
HelloGCC工作组 (www.hellogcc.org)
************************************************************************

开源开发工具大会(原HelloGCC技术讨论会)是开源软件开发者的大会,您可以在这里分享自己在开源软件方面的开发工作,研究成果,经验学习。我们的话题主要面向开源开发工具。

话题内容可以为:
* GNU工具链(gcc,gdb,binutils等)
* LLVM等其它开源编译器
* 其它开源开发、调试、模拟工具

话题形式可以为:
* 对自己工作的介绍
* 对已有工作的介绍
* 教程,经验等
* 其它形式,比如闪电演讲

如果您有相关话题,欢迎和我们联系:
* 发送邮件到 hellogcc@freelists.org (需要先订阅:http://www.freelists.org/list/hellogcc)
* 登陆freenode IRC #hellogcc房间

往届会议:
* OSDT 2015: http://www.hellogcc.org/?p=34190
* OSDT 2014: http://www.hellogcc.org/?p=33910
* HelloGCC 2013: http://www.hellogcc.org/?p=33518
* HelloGCC 2012: http://linux.chinaunix.net/hellogcc2012
* HelloGCC 2011: http://linux.chinaunix.net/hellogcc2011
* HelloGCC 2010: http://linux.chinaunix.net/hellogcc2010
* HelloGCC 2009: https://sites.google.com/site/hellogccworkshop/hui-yi-ri-cheng

如果贵公司有意提供赞助,欢迎和我们联系 hellogcc.workgroup@gmail.com。

GCC 4.8之后的调试问题

gdb无法调试4.8或者更新版本gcc编译的程序,这个问题比较常见。原因很简单,参见 https://gcc.gnu.org/gcc-4.8/changes.html

DWARF4 is now the default when generating DWARF debug information. When -g is used on a platform that uses DWARF debugging information, GCC will now default to -gdwarf-4 -fno-debug-types-section.
GDB 7.5, Valgrind 3.8.0 and elfutils 0.154 debug information consumers support DWARF4 by default. Before GCC 4.8 the default version used was DWARF2. To make GCC 4.8 generate an older DWARF version use -g together with -gdwarf-2 or -gdwarf-3. The default for Darwin and VxWorks is still -gdwarf-2 -gstrict-dwarf.

这是因为,gcc 4.8缺省生成dwarf4版本的调试信息,旧版本的gdb无法识别。所以,要么升级gdb,要么通过选项-g -gdwarf-2或者-gdwarf-3来生成低版本的dwarf调试信息。

注:查看ELF文件的dwarf版本信息,可以使用如下命令

readelf -wi a.out | grep Version

为gcc源代码生成tags

LLVM的td文件使用的是tablegen语言,所以,它可以增加一个tablegen后端,来输出td文件的tags。

gcc的def文件使用的是宏定义,格式比较随意,很难通过类似llvm这样的方式,来为def文件生成tags。好在,大多def文件都是这样的一个格式:

DEF (ENUM, NAME, ...)

例如:

DEF_GOMP_BUILTIN (BUILT_IN_OMP_GET_NUM_THREADS, "omp_get_num_threads",
                  BT_FN_INT, ATTR_CONST_NOTHROW_LEAF_LIST)

通过如下的ctags命令,可以粗略的为这些def文件生成tags索引:

$ ctags --langdef=def --langmap=def:.def --regex-def="/^[ \t]*[a-zA-Z0-9_]+[ \t]*\([ \t]*([a-zA-Z0-9_]+)/\1/d,definition/" -R .

可以看到tags文件里生成了如下内容:

BUILT_IN_OMP_GET_NUM_THREADS    omp-builtins.def        /^DEF_GOMP_BUILTIN (BUILT_IN_OMP_GET_NUM_THREADS, "omp_get_num_threads",$/;"    d

目前gcc的代码虽然是c++实现,但是后缀名还是“.c”。所以,需要加上一个额外选项告诉ctags:

--langmap=c++:+.c

去掉testsuite目录:

--exclude=testsuite

过滤掉代码中一些宏的干扰:

-I GTY+ -I VEC+ -I DEF_VEC_P+

把build目录加进来,合起来的命令如下:

$ ctags --langdef=def --langmap=def:.def --regex-def="/^[ \t]*[a-zA-Z0-9_]+[ \t]*\([ \t]*([a-zA-Z0-9_]+)/\1/d,definition/" --langmap=c++:+.c --exclude=testsuite -I GTY+ -I VEC+ -I DEF_VEC_P+ -R . ~/build/build-gcc-trunk/gcc

使用gcc-6.1.0编译SPEC2006错误参考

一堆错误,还好逐个都解决了,其中:

400.perlbench,编译出错,一堆重定义,是inline的不同实现标准造成的,需要加上一个选项-std=gnu90。gnu90和c99的对extern函数的inline实现方式不同。
416.gamess 运行出错,需要加上一个选项-funconstrained-commons,参考https://gcc.gnu.org/ml/gcc-patches/2016-03/msg00465.html,gfortran文档中没有提到这个选项。
其它还有一些是strcat,memcp之类的函数,没有显式的include相应的头文件。还有的,是不在std namespace中,代码中竟然有std::。