当我尝试静态链接使用Gopacket的Go程序时,我会遇到以下错误:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a(pcap-dbus.o): in function `dbus_write':
(.text+0x103): undefined reference to `dbus_message_demarshal'
/usr/bin/ld: (.text+0x119): undefined reference to `dbus_connection_send'
/usr/bin/ld: (.text+0x122): undefined reference to `dbus_connection_flush'
/usr/bin/ld: (.text+0x12a): undefined reference to `dbus_message_unref'
/usr/bin/ld: (.text+0x178): undefined reference to `dbus_error_free'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a(pcap-dbus.o): in function `dbus_read':
(.text+0x1c3): undefined reference to `dbus_connection_pop_message'
/usr/bin/ld: (.text+0x1e1): undefined reference to `dbus_connection_pop_message'
/usr/bin/ld: (.text+0x1f6): undefined reference to `dbus_connection_read_write'
/usr/bin/ld: (.text+0x262): undefined reference to `dbus_message_is_signal'
/usr/bin/ld: (.text+0x27f): undefined reference to `dbus_message_marshal'
/usr/bin/ld: (.text+0x2e3): undefined reference to `dbus_free'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a(pcap-dbus.o): in function `dbus_cleanup':
(.text+0x350): undefined reference to `dbus_connection_unref'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a(pcap-dbus.o): in function `dbus_activate':
(.text+0x3fa): undefined reference to `dbus_connection_open'
/usr/bin/ld: (.text+0x412): undefined reference to `dbus_bus_register'
...
实际上,这些符号要么不存在/usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a
,要么显示为未定义。例如:
$ readelf -s /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a | grep dbus_message_marshal
42: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND dbus_message_marshal
这些函数都不是从我的程序中调用的,而是由于对Gopacket的依赖而发生的。
我安装了libpcap
:
$ apt list --installed|grep pcap
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
libpcap-dev/jammy,now 1.10.1-4build1 amd64 [installed]
libpcap0.8-dev/jammy,now 1.10.1-4build1 amd64 [installed]
libpcap0.8/jammy,now 1.10.1-4build1 amd64 [installed,automatic]
我还需要什么吗?下面是我的编译方法:
GOOS=linux CGO_ENABLED=1 go build \
-ldflags "-linkmode external -extldflags \"-static\"" \
-o bin/myprog \
-buildvcs=false
如果我不包含-ldflags
,程序会编译,但它不是静态链接的。
我用的是Go 1.18。
2条答案
按热度按时间li9yvcax1#
您访问的页面不存在
它们不是 * 在 * libpcap中,而是 * 由该版本 * 的libpcap调用的。
你必须链接
pkg-config --libs --static libdpdk
报告的所有库,才能静态地链接该版本的libpcap和 * 任何 * 程序,不管它是否在Go语言中。xqnpmsa82#
似乎不可能制作一个使用Gopacket的静态链接二进制文件。
我更新了构建命令以使用libdbus-1。这消除了未定义的dbus_* 错误:
但是,我得到了这个错误:
这些函数来自libsystemd。我安装了
libsystemd-dev
,但似乎有no static library用于libsystemd。