【问题标题】:Undefined reference error linking gssapi in Alpine在 Alpine 中链接 gssapi 的未定义参考错误
【发布时间】:2020-12-16 06:51:13
【问题描述】:

尝试在 Alpine 3.12 中构建以下迷你测试程序时,链接器拒绝在提供的库中查找符号。在 Centos 8 中同样可以正常工作。

#include <string.h>
#include <gssapi/gssapi.h>

int main(int argc, char *argv[])
{
    OM_uint32 major_status, minor_status;
    gss_OID_set gss_mech_set;
    int i;

    static gss_OID_desc _gss_mech_spnego = {6, (void *)"\x2b\x06\x01\x05\x05\x02"};
    gss_OID gss_mech_spnego = &_gss_mech_spnego;

    major_status = gss_indicate_mechs(&minor_status, &gss_mech_set);

    for (i = 0; i < gss_mech_set->count; i++)
    {
        if (!memcmp(gss_mech_set->elements[i].elements, gss_mech_spnego->elements, gss_mech_set->elements[i].length))
        {
            return 0;
        }
    }

    return 1;
}

$ gcc -o test -lgssapi test.c
/usr/lib/gcc/x86_64-alpine-linux-musl/9.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: /tmp/ccdnkIOh.o: in function `main':
test.c:(.text+0x38): undefined reference to `gss_indicate_mechs'
collect2: error: ld returned 1 exit status

$ objdump -T /usr/lib/libgssapi.so | grep gss_indicate_mechs
0000000000020afb g    DF .text  00000000000000db  HEIMDAL_GSS_2.0 gss_indicate_mechs
00000000000242c8 g    DF .text  0000000000000180  HEIMDAL_GSS_2.0 gss_indicate_mechs_by_attrs

已安装 APK

alpine-sdk
heimdal
heimdal-dev

我错过了什么?

【问题讨论】:

    标签: gcc reference linker alpine


    【解决方案1】:

    您面临的问题是因为您将库放在目标文件之前。当链接器扫描库时,不需要符号,链接器扫描目标文件后,他将需要gss_indicate_mechs,但之后没有库提供它。要解决您的问题,请使用:gcc -o test test.c -lgssapi

    通常,您必须将库放在目标文件之后。对于库,如果没有循环依赖,则将依赖于左侧的那个和提供符号的那个放在右侧。在循环依赖的情况下,或者如果您不想像前面所说的那样放置库,您将不得不使用链接器选项 start-group 和 end-group。

    【讨论】:

    • 解决了它,但是在这个时代,命令行上的对象和库的顺序很重要,这似乎有点奇怪。我希望链接器首先考虑所有对象中的符号,然后执行链接阶段
    • 确实,一方面它可能很有趣。另一方面,假设我们有两个库 libx 和 liby(我们没有源代码),它们都有一个 process 函数。并且您需要在两个单独的对象文件中同时使用 process 函数,这在当前方式下是可能的,如果在开始时考虑所有符号则不可能。这只是我刚刚想到的一个例子,但可能(或可能)还有其他原因。
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多