首页 > 解决方案 > 在 Alpine 中链接 gssapi 的未定义参考错误

问题描述

尝试在 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

我错过了什么?

标签: gccreferencelinkeralpine

解决方案


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

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


推荐阅读