【问题标题】:Position dependent code位置相关代码
【发布时间】:2017-04-27 06:01:03
【问题描述】:

我正在使用一个使用 sparc v8 架构的处理器。我想编译我的可执行文件,使每个函数调用都是绝对地址。使用 -fPIC 选项生成与位置无关的代码,此标志是否有任何反转?

【问题讨论】:

    标签: gcc sparc fpic


    【解决方案1】:

    大多数 GCC 选项同时具有 -fxxx-fno-xxx 变体。

    您可以轻松测试fPIC 是否属于这种情况。只需编译一些简单的测试:

    int main () { printf ("Hello, world!\n"); }
    

    命令行如下:

    gcc -fPIC test.c -S
    

    并在汇编器中查找 PLT 相关调用

        call    puts@PLT
    

    现在尝试用相反的方式取消这个选项:

    gcc -fPIC test.c -S -fno-PIC
    

    您会看到,与 PLT 相关的调用已经消失,所以一切正常。

    【讨论】:

    • 哦,我明白了。 sparc v8 指令集有两条跳转指令。 “call”表示相对跳跃,“jmpl”表示绝对跳跃。所以必须可以生成带有绝对跳转的代码。我刚刚尝试使用带有 -fno-pic 的 sparc gcc。即使代码编译它仍然会生成图片代码。我还需要将此标志传递给链接器吗?
    • 不,只是编译器选项。 fno-PIC 和 fno-pic(大小模式)是有区别的。检查编译器行:取消选项应该放在最后并且在相同的情况下。
    猜你喜欢
    • 1970-01-01
    • 2023-02-15
    • 2012-10-10
    • 1970-01-01
    • 2011-07-19
    • 2019-11-24
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多