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