gcc - 在 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
我错过了什么?
解决方案
您面临的问题是因为您将库放置在目标文件之前。当链接器将扫描库时,没有需要的符号,并且在链接器将扫描他需要的目标文件gss_indicate_mechs
但之后没有库提供它之后。要解决您的问题,请使用:gcc -o test test.c -lgssapi
。
通常,您必须将库放在目标文件之后。对于库,如果没有循环依赖,则将依赖于左侧的那个和提供符号的那个放在右侧。在循环依赖的情况下,或者如果您不想像前面所说的那样放置库,您将不得不使用链接器选项 start-group 和 end-group。