求助:cpuid指令与gcc -fPIC选项的冲突
我使用gcc -fPIC选项来编译一段代码,其中需要用到CPUID指令,编译后出现Can't find register "BREG" while reloading "asm"的错误。
google后得知-fPIC选项要求独占ebx寄存器,因而导致编译失败。
这种情况下,我该怎么处理? 非常感谢! 你的cpuid指令想必是在一段inline assembly中? 那好办, 声称ebx为clobbered, 就OK了 本帖最后由 qizhanglu 于 2010-08-14 12:54 编辑
抱歉现在才来回复,我的cpuid确实是在inline assembly当中,将ebx放入 clobber list当中没能解决我的问题,编译器会给出新的错误"PIC register'ebx' clobbered in 'asm' "。
内嵌汇编代码如下:void cpuid_t(int* p, unsigned int param)
{
_asm_ _volatile_
( "cpuid;"
: "=a"(p), "=b"(p), "=c"(p), "=d"(p)
: "a" (param)
: "ebx"
);
}非常感谢。 这样吧, 在汇编里头, 先pushl ebx, 再cpuid指令,然后把ebx的值赋给某个其他的寄存器(或内存位置),然后在pop 到ebx(恢复之前保存的ebx)。
这样子,你在汇编中虽然明确用到了ebx,但是不必向gcc声称这一点。 亦即: 不必明确写"=b",也不比在clobber list中添加ebx。
这个写法,算是一个tricky的workaround, gcc会通过的。
PS,你在3楼的写法, 既然output中已经有"=b"了,那意味着ebx已经在clobber list中了,没必要再写一遍了。 所以gcc会给那个新的错误。 你们公司做什么的啊,还有这种活,招人不? QNX好像招人呢,O那SB没有留你?12同学被留下了吧? QNX好像招人呢,O那SB没有留你?12同学被留下了吧?
prolj 发表于 2010-08-15 19:55 http://linux.chinaunix.net/bbs/images/common/back.gif
12肯定留下, 除非自己想走。现在大家都不知道能不能拿到offer, 不过看样子, 一堆人不想要这个offer了。
QNX去年说要在中国成立研发中心, 也不知道现在情况如何了。 如果是真的, 去了就爽了啊 你去QNX看看吧,公司应该很不错。
前一段时间我遇到了内联mmx汇编的问题,寄存器分配的时候寄存器不够用了,ffmpeg的,是不是这个家伙写代码的时候没有手动保护现场啊?好像在x86目录下,啥templete.c文件里面。 问题解决了,多谢!
我们公司主要是在Windows下开发,且是个没落了的小公司。你来就真的屈才了。
我也得努力啊,争取可以被prolj给卖了。
页:
[1]