求助,关于一个ld的问题

发布于 2022-09-26 11:13:40 字数 5749 浏览 12 评论 0

powerpc平台Linux (none) 2.6.18.8

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main(void)
{
        void *handle;
        void (*errfcn)(const char *fmt, ...);
        const char *errmsg;
        FILE *pf;

        handle = dlopen("./liberr.so", RTLD_NOW);
        if(handle == NULL) {
                fprintf(stderr, "Failed to load liberr.so: %s\n", dlerror());
                exit(EXIT_FAILURE);
        }

        dlerror();
        errfcn = dlsym(handle, "err_ret");
        if((errmsg = dlerror()) != NULL) {
                fprintf(stderr, "Didn't find err_ret(): %s\n", errmsg);
                exit(EXIT_FAILURE);
        }
        if((pf = fopen("foobar", "r")) == NULL)
                errfcn("couldn't open foobar");

        dlclose(handle);
        return EXIT_SUCCESS;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

场罚期间 2022-10-03 11:13:40

-fpic
如果支持这种目标机,编译器就生成位置无关目标码.适用于共享库(shared library).
-fPIC
如果支持这种目标机,编译器就输出位置无关目标码.适用于动态连接(dynamic linking),即使分支需要大范围转移

这是GCC手册上关于这两个参数的说明,具体我也不太清楚

撩起发的微风 2022-10-03 11:13:40

PIC代码的生成,貌似是gcc的问题而不是ld的问题

gcc manul上面有说
-fpic        If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an error message from the linker indicating that -fpic does not work; in that case, recompile with -fPIC instead. (These maximums are 8k on the SPARC and 32k on the m68k and RS/6000. The 386 has no such limit.)

-fPIC       If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k, PowerPC and SPARC. Position-independent code requires special support, and therefore works only on certain machines.

关键在于GOT全局偏移量表里面的跳转项大小。
intel处理器应该是统一4字节,没有问题。
powerpc上由于汇编码或者机器码的特殊要求,所以跳转项分为短、长两种。

-fpic为了节约内存,在GOT里面预留了“短”长度。
而-fPIC则采用了更大的跳转项。

具体什么情况我也不了解了。
不知道楼主懂不懂powerpc的汇编,讲解一下powerpc的跳转指令??

睫毛上残留的泪 2022-10-03 11:13:40

楼上正解,楼主的跳转已经超过了32M
加个-mlongcall 编译一下应该可以

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文