英文:
Unable to create static binary because of undefined reference to dbus_*
问题
当我尝试静态链接使用Gopacket的Go程序时,我遇到了以下错误:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a(pcap-dbus.o): 在函数 `dbus_write' 中:
(.text+0x103): 对 `dbus_message_demarshal' 的引用未定义
/usr/bin/ld: (.text+0x119): 对 `dbus_connection_send' 的引用未定义
/usr/bin/ld: (.text+0x122): 对 `dbus_connection_flush' 的引用未定义
/usr/bin/ld: (.text+0x12a): 对 `dbus_message_unref' 的引用未定义
/usr/bin/ld: (.text+0x178): 对 `dbus_error_free' 的引用未定义
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a(pcap-dbus.o): 在函数 `dbus_read' 中:
(.text+0x1c3): 对 `dbus_connection_pop_message' 的引用未定义
/usr/bin/ld: (.text+0x1e1): 对 `dbus_connection_pop_message' 的引用未定义
/usr/bin/ld: (.text+0x1f6): 对 `dbus_connection_read_write' 的引用未定义
/usr/bin/ld: (.text+0x262): 对 `dbus_message_is_signal' 的引用未定义
/usr/bin/ld: (.text+0x27f): 对 `dbus_message_marshal' 的引用未定义
/usr/bin/ld: (.text+0x2e3): 对 `dbus_free' 的引用未定义
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a(pcap-dbus.o): 在函数 `dbus_cleanup' 中:
(.text+0x350): 对 `dbus_connection_unref' 的引用未定义
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a(pcap-dbus.o): 在函数 `dbus_activate' 中:
(.text+0x3fa): 对 `dbus_connection_open' 的引用未定义
/usr/bin/ld: (.text+0x412): 对 `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 版本。
英文:
I get these errors when I try to statically link my Go program that uses Gopacket:
/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'
...
Indeed these symbols indeed either do not exist /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a
or show up as undefined. For example:
$ 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
None of these functions are called from my program, but are happening because of the dependency to Gopacket.
I have libpcap
installed:
$ 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]
Is there anything else I need? Here's how I compile:
GOOS=linux CGO_ENABLED=1 go build \
-ldflags "-linkmode external -extldflags \"-static\"" \
-o bin/myprog \
-buildvcs=false
If I do not include -ldflags
, the program compiles, but it is not statically linked.
I am using Go 1.18.
答案1
得分: 1
这些文件并不在libpcap中,而是由该版本的libpcap调用。
为了将该版本的libpcap与任何程序(无论是Go还是其他语言)进行静态链接,您需要使用pkg-config --libs --static libdpdk
报告的所有库进行链接。
英文:
> do not exist /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libpcap.a
They are not in libpcap. They are called by that version of libpcap.
You will have to link with all of the libraries reported by pkg-config --libs --static libdpdk
in order to statically link that version of libpcap with any program whether it's in Go or not.
答案2
得分: 0
似乎无法创建一个使用Gopacket的静态链接二进制文件。
我更新了构建命令以使用libdbus-1。这样就消除了未定义的dbus_*错误:
GOOS=linux CGO_ENABLED=1 CGO_LDFLAGS="-ldbus-1" go build \
-ldflags "-linkmode external -extldflags \"-static\"" \
-o bin/app \
-buildvcs=false
然而,我遇到了这个错误:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libdbus-1.a(libdbus_1_la-dbus-sysdeps-unix.o): 在函数 `_dbus_listen_systemd_sockets' 中:
(.text+0x200e): 对 `sd_listen_fds' 的未定义引用
/usr/bin/ld: (.text+0x204f): 对 `sd_is_socket' 的未定义引用
collect2: error: ld 返回了状态 1
这些函数来自libsystemd。我安装了libsystemd-dev
,但似乎没有libsystemd的静态库。
英文:
It's seems like it is impossible to make a statically linked binary that uses Gopacket.
I updated the build command to use libdbus-1. This got rid of the undefined dbus_* errors:
GOOS=linux CGO_ENABLED=1 CGO_LDFLAGS="-ldbus-1" go build \
-ldflags "-linkmode external -extldflags \"-static\"" \
-o bin/app \
-buildvcs=false
However, I got this error:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libdbus-1.a(libdbus_1_la-dbus-sysdeps-unix.o): in function `_dbus_listen_systemd_sockets':
(.text+0x200e): undefined reference to `sd_listen_fds'
/usr/bin/ld: (.text+0x204f): undefined reference to `sd_is_socket'
collect2: error: ld returned 1 exit status
These functions come from libsystemd. I installed libsystemd-dev
, but it seems like there is no static library for libsystemd.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论