gcc类指针this用ecx传递还是esp传递?

26 views
Skip to first unread message

lynnux

unread,
Jul 26, 2013, 2:47:36 AM7/26/13
to chi...@googlegroups.com
我遇到一个很奇怪的问题
环境:tdmgcc4.6.1,欲编译s2e中的revgen,它用到了clang2.6,编译出来的clang release仅有tblgen等几个没问题,其它clang.exe什么的运行直接报错。

我反汇编分析了下,发现出错的原因是在调用某个类时,传递类指针用的堆栈也就是esp,而tblgen中用的ecx,link的那个类的代码也是把ecx当成类指针。

我看了tblgen和没问题的那几个源码是在utils里的,而有问题的源码是在tools里,于是猜想可能跟编译选项有关,但是我对gcc不是很熟悉,不知道什么指令可以控制g++生成的汇编代码里用esp或者ecx来表示类指针即this。clang的代码你知道的,很多,makefile我也不是很熟悉。

我自己测试了个小程序,用的是esp表示类指针。

lynnux

unread,
Jul 26, 2013, 3:15:13 AM7/26/13
to chi...@googlegroups.com
找到原因了,我先用4.7.1编译的,默认是ecx,后来用4.6.1不是了,gcc编译选项(4.6以后):-mabi = ms

> I.e. '-mabi = ms' is now used by default?

Yes, it is for mingw targets.

asmwarrior

unread,
Jul 26, 2013, 3:28:24 AM7/26/13
to chi...@googlegroups.com, lynnux
On 2013-7-26 15:15, lynnux wrote:
> 找到原因了,我先用4.7.1编译的,默认是ecx,后来用4.6.1不是了,gcc编译选项(4.6以后):-mabi = ms
>
> 参考:http://gcc.gnu.org/ml/gcc/2012-05/msg00327.html
> > I.e. '-mabi = ms' is now used by default?
>
> Yes, it is for mingw targets.
我大概能看懂你说的,实际上就是calling convention的概念。
GCC的4.7.x和4.6.x在这个地方有所改变,主要是针对类成员函数的调用的calling convention的改变。
具体细节我没有仔细研究过,反正就这么几种调用方式:
c_call
std_call
...
不同的调用策略采用不同的寄存器进行传递。

asmwarrior

unread,
Jul 26, 2013, 10:38:36 AM7/26/13
to Code::Blocks中国开发组
On 2013-7-26 20:39, lynnux wrote:
> btw:我对比了下使用-mabi=ms 4.6和4.7的反汇编结果,4.6用ecx表示this还不成熟,代码体积大很多,而4.7生成的代码就跟vs生成的基本一样,gcc真是强大!
你这个怎么对比的,会不会是由于不同的优化导致的?还是你是在-g -O0下比较的?我一直在用MinGWGCC4.6.3版本,看起来得升级了,只是嫌升级太麻烦,一大堆东西都要重新编译过。其实代码体积的问题,也很难说,以前在Codeblocks论坛里面看到讨论,在GCC下如果编译一个简单的带有std::string的程序,如果是4.7.x的GCC,会剔除掉一些不用的库和函数,而GCC4.6.x不会。具体的,见:http://forums.codeblocks.org/index.php/topic,16772.msg114299.html#msg114299 这个帖子的上下讨论。

> 另外clang3.3发布了,支持c++11全部特性,NB,而且据说编译速度也有提升,太NB了。
clang牛逼,我希望gcc也牛逼。
>
> 我看的revgen那个工程的目标是反汇编把x86转换成LLVM IR,这个潜力无限啊,成功的话可以把PC的代码转换到其他平台。
不错。

xunxun

unread,
Jul 26, 2013, 11:09:22 AM7/26/13
to chi...@googlegroups.com, lynnux
于 2013/7/26 星期五 15:15, lynnux 写道:
找到原因了,我先用4.7.1编译的,默认是ecx,后来用4.6.1不是了,gcc编译选项(4.6以 后):-mabi = ms


> I.e. '-mabi = ms' is now used by default?

Yes, it is for mingw targets.
这是个4.7的变更,Kai说是为了和微软的方法保持一致


在 2013年7月26日下午2:47,lynnux <lynn...@gmail.com>写 道:
我遇到一个很奇怪的问题
环境:tdmgcc4.6.1,欲编译s2e中的revgen,它用到了clang2.6,编译出来的clang release仅有tblgen等几个没问题,其它clang.exe什么的运行直接报错。

我反汇编分析了下,发现出错的原因是在调用某个类时,传递类指针用的堆栈也就是esp,而tblgen中用的 ecx,link的那个类的代码也是把ecx当成类指针。

我看了tblgen和没问题的那几个源码是在utils里的,而有问题的源码是在tools里,于是猜想可能跟编 译选项有关,但是我对gcc不是很熟悉,不知道什么指令可以控制g++生成的汇编代码里用esp或者ecx来表示类指针 即this。clang的代码你知道的,很多,makefile我也不是很熟悉。

我自己测试了个小程序,用的是esp表示类指针。





-- 
Best Regards,
xunxun

xunxun

unread,
Jul 26, 2013, 11:13:58 AM7/26/13
to chi...@googlegroups.com, lynnux
于 2013/7/26 星期五 14:47, lynnux 写道:
> 我遇到一个很奇怪的问题
> 环境:tdmgcc4.6.1,欲编译s2e中的revgen,它用到了clang2.6,编译出来的
> clang release仅有tblgen等几个没问题,其它clang.exe什么的运行直接报错。
要注意,gcc只保证小版本范围内ABI是兼容的,这正如用gcc4.6去构建gcc4.7,用
gcc4.7去构建gcc4.8出来的 target是基本不可用的一样(特指C++)。用gcc去构
建clang时,要注意它的调用顺序目前和gcc4.6的一致,ABI的话不好说, 所以编
译clang时,最好在用clang去编译clang和c++库,完成自举过程
>
> 我反汇编分析了下,发现出错的原因是在调用某个类时,传递类指针用的堆栈也
> 就是esp,而tblgen中用 的ecx,link的那个类的代码也是把ecx当成类指针。
>
> 我看了tblgen和没问题的那几个源码是在utils里的,而有问题的源码是在tools
> 里,于是猜想可 能跟编译选项有关,但是我对gcc不是很熟悉,不知道什么指令
> 可以控制g++生成的汇编代码里用esp或者ecx来表示类指针即 this。clang的代

xunxun

unread,
Jul 26, 2013, 11:16:29 AM7/26/13
to chi...@googlegroups.com, asmwarrior
于 2013/7/26 星期五 22:38, asmwarrior 写道:
> On 2013-7-26 20:39, lynnux wrote:
>> btw:我对比了下使用-mabi=ms 4.6和4.7的反汇编结果,4.6用ecx表示this还不成熟,代码体积大很多,而4.7生成的代码就跟vs生成的基本一样,gcc真是强大!
> 你这个怎么对比的,会不会是由于不同的优化导致的?还是你是在-g -O0下比较的?我一直在用MinGWGCC4.6.3版本,看起来得升级了,只是嫌升级太麻烦,一大堆东西都要重新编译过。其实代码体积的问题,也很难说,以前在Codeblocks论坛里面看到讨论,在GCC下如果编译一个简单的带有std::string的程序,如果是4.7.x的GCC,会剔除掉一些不用的库和函数,而GCC4.6.x不会。具体的,见:http://forums.codeblocks.org/index.php/topic,16772.msg114299.html#msg114299 这个帖子的上下讨论。
>
>> 另外clang3.3发布了,支持c++11全部特性,NB,而且据说编译速度也有提升,太NB了。
> clang牛逼,我希望gcc也牛逼。
gcc4.8的svn latest也支持C++11全部特性了,即使是最新的4.8的release,也只
有一个C++11特性未完成

当然,clang的编译速度,gcc暂时还没法比,特别是windows平台
>> 我看的revgen那个工程的目标是反汇编把x86转换成LLVM IR,这个潜力无限啊,成功的话可以把PC的代码转换到其他平台。
> 不错。
>


--
Best Regards,
xunxun

lynnux

unread,
Jul 26, 2013, 11:27:00 AM7/26/13
to chi...@googlegroups.com
感谢asmwarrior和xunxun的指点,呵呵。
我一直是vs2008开发,但有特别觊觎c++11特性,但是vs2010和2012太大了,一点都不喜欢
现在gcc和clang进步飞快,要多多学习gcc了。
@asmwarrior,我擅长反汇编,逆向之类的,比如你的网名:ollydbg,呵呵。




--
--
您收到此信息是由于您订阅了 Google 论坛“Code::Blocks中国开发组”论坛。
要在此论坛发帖,请发电子邮件到 chi...@googlegroups.com
要退订此论坛,请发邮件至 chinacb+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com.hk/group/chinacb?hl=zh-CN 访问
该论坛

--- 您收到此邮件是因为您订阅了 Google 网上论坛的“Code::Blocks中国开发组”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 chinacb+unsubscribe@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out



asm warrior

unread,
Jul 27, 2013, 11:23:29 AM7/27/13
to chi...@googlegroups.com

不能称为指点,只能说大家相互交流,分享知识,共同提高。我以前学习和使用过ollydbg这个调试器,当时主要目的是学习win32汇编程序设计,现在好久都不用这个调试器了。

大概10年前,我当时想,要是有一个开源的调试器该多好,后来发现了GDB,就折腾起来了。

lynnux

unread,
Jul 31, 2013, 11:39:06 AM7/31/13
to chi...@googlegroups.com
不好意思哈,这几天仔细看了下,之前说的4.7编译的体积要小于4.6是错误的。我只是试了下tdm
4.7和4.6两个版本的编译结果,4.7的确实小点,但这不能说明什么,我怕误导了asmwarrior了,4.6换4.7可工作量可不小。
又编译了些程序看了下,其实这两个版本以mabi=ms编译出来的结果是类似的,都是ecx表示this,但是进入类成员函数后,又会把ecx的值赋给eax,用eax+偏移量来操作类变量。我也实验了clang的编译,结果也是这样的。
sorry for my spam.

在 2013年7月27日下午11:23,asm warrior <asmwa...@gmail.com> 写道:
> 不能称为指点,只能说大家相互交流,分享知识,共同提高。我以前学习和使用过ollydbg这个调试器,当时主要目的是学习win32汇编程序设计,现在好久都不用这个调试器了。
>
> 大概10年前,我当时想,要是有一个开源的调试器该多好,后来发现了GDB,就折腾起来了。
>
> --
> --
> 您收到此信息是由于您订阅了 Google 论坛“Code::Blocks中国开发组”论坛。
> 要在此论坛发帖,请发电子邮件到 chi...@googlegroups.com
> 要退订此论坛,请发邮件至 chinacb+u...@googlegroups.com
> 更多选项,请通过 http://groups.google.com.hk/group/chinacb?hl=zh-CN 访问
> 该论坛
>
> ---
> 您收到此邮件是因为您订阅了 Google 网上论坛的“Code::Blocks中国开发组”论坛。
> 要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 chinacb+u...@googlegroups.com
> 要查看更多选项,请访问 https://groups.google.com/groups/opt_out
>
>

asmwarrior

unread,
Aug 1, 2013, 12:12:32 PM8/1/13
to chi...@googlegroups.com, lynnux
On 2013-7-31 23:39, lynnux wrote:
> 不好意思哈,这几天仔细看了下,之前说的4.7编译的体积要小于4.6是错误的。我只是试了下tdm
> 4.7和4.6两个版本的编译结果,4.7的确实小点,但这不能说明什么,我怕误导了asmwarrior了,4.6换4.7可工作量可不小。
> 又编译了些程序看了下,其实这两个版本以mabi=ms编译出来的结果是类似的,都是ecx表示this,但是进入类成员函数后,又会把ecx的值赋给eax,用eax+偏移量来操作类变量。我也实验了clang的编译,结果也是这样的。
> sorry for my spam.
我觉得挺好,不需要为此sorry。即是一次技术交流,也为冷清的Code::Blocks中国开发组的邮件列表带来新的讨论。

Reply all
Reply to author
Forward
0 new messages