【问题标题】:GCC warning: non-pic addressing form not suitible for pic codeGCC 警告:非 pic 寻址形式不适合 pic 代码
【发布时间】:2011-06-01 12:44:23
【问题描述】:

下面的代码在 MSVC 中编译得很好,但是 GCC 给出了一个警告,这真的让我很烦恼:non-pic 寻址形式不适合 pic 代码。

能否告诉我这个警告的原因以及如果它确实是一个潜在的问题如何解决它?我正在使用 -fasm-blocks 编译器选项来启用 intel 样式程序集,添加 -fpic 参数没有区别。

unsigned short dataMask[] = {0x0ffff, 0x07bef, 0x039e7, 0x018e3, 0x0861, 0x020, 0,0};

void test
{
    _asm
    {
        xor     ecx, ecx // ecx == 0
        //...
        // value in ecx may change
        //...
        mov     bx, [dataMask + ecx * 2]
        //...
    };
}

【问题讨论】:

  • "PIC 代码"?是像“ATM机”还是“PIN码”?我对 gcc 的期望会更好:-)
  • PIC 代码表示位置无关代码,需要在任何地址空间正确执行指令。代码在库中,所以我很担心这个警告......
  • @Ryan,我想你误解了我的评论 - PIC 是“位置无关代码”,PIC code,即“位置无关代码代码”是错误的,比如自动柜员机或个人识别号码号码 - 为我提供了一种奇怪的幽默感。
  • 啊,现在连我都明白了:)
  • 你应该加上-fno-pic,因为你使用绝对寻址,确实不适合pic

标签: visual-c++ gcc assembly inline-assembly


【解决方案1】:

GCC 试图告诉您 [dataMask + ecx * 2] 不是有效的寻址模式。这是由于 PIC 的性质:它是 RISC,并且您正在使用 CISC 语法编写 RISC 代码,而不是 IMO 的好主意。基本上,x86 有一个更完整(和复杂)的指令集,而 PIC 的指令集没有那么扩展。我现在很累,但我希望我很清楚;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多