如何满足 32 位 'dialog' 工具静态编译的依赖关系

How to satisfy dependencies for static compilation of 'dialog' tool for 32-bit

我想在 64 位 Ubuntu (16.04) 中将 dialog 程序编译为 32 位静态 linked 可执行文件。这使得它可以轻松地在 makeself 存档中分发,而不必担心依赖关系等问题。我已经在 3 年前以这种方式构建了它,并且还记下了如何做:

# get source and build-deps, then run:
./configure CFLAGS="-m32" LDFLAGS="-m32 -static"
make

现在我修改了源代码(添加了附加选项),但重建失败并抱怨未定义对 Gpm_*** 函数的引用。这与我的修改无关。链接阶段:

gcc -o dialog dialog.o -L. -ldialog -Wl,-rpath,/lib64   -L/lib64 -m32 -static -lncurses -ltermcap -lm 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu/libncurses.a(lib_mouse.o): In function `_nc_mouse_event':
(.text+0x632): undefined reference to `Gpm_GetEvent'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu/libncurses.a(lib_mouse.o): In function `enable_gpm_mouse':
(.text+0xcd2): undefined reference to `Gpm_Close'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu/libncurses.a(lib_mouse.o): In function `enable_gpm_mouse':
(.text+0xd22): undefined reference to `Gpm_Open'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu/libncurses.a(lib_mouse.o): In function `enable_gpm_mouse':
(.text+0xd3a): undefined reference to `Gpm_Close'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu/libncurses.a(lib_mouse.o): In function `_nc_mouse_init':
(.text+0xe8c): undefined reference to `gpm_fd'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu/libncurses.a(lib_mouse.o): In function `mouse_activate':
(.text+0x1061): undefined reference to `gpm_fd'
collect2: error: ld returned 1 exit status
makefile:211: recipe for target 'dialog' failed
make: *** [dialog] Error 1

linker 选择了 libncurses.a,这对我来说似乎没问题,因为它是一个静态库存档。我不明白为什么找不到 Gpm_*** 函数。 libgpm.a 提供这些并且位于同一目录中。即使通过向 LDFLAGS 添加 /usr/lib/i386-linux-gnu/libgpm.a 进行配置也没有效果。

怎样才能link成功?

更新:

在此处查看详细 linking (-Wl,--verbose) 的结果:https://pastebin.com/AP48KMGt

安装 gcc-multilib(当然)和 libncurses5libtinfolibgpm:

的 i386 开发包后,它对我有用
sudo apt install gcc-multilib libncurses5-dev:i386 libtinfo-dev:i386 libgpm-dev:i386

并与他们明确链接:

gcc -o dialog dialog.o -L. -ldialog -g -O2 -m32 -static -lncurses -ltinfo -lgpm -lm

./configure根据你的示例生成了一个可用的 Makefile,

$ ./configure CFLAGS="-m32" LDFLAGS="-m32 -static" LIBS="-lgpm"
$ make
...
gcc -o dialog dialog.o -L. -ldialog -m32 -Wl,-rpath,/lib64   -L/lib64 -m32 -static -lncurses -ltermcap -lm -lgpm

结果似乎是一个有效的 i386 可执行文件:

$ file dialog
dialog: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=4cbdb45a86cb5e6859db8c7cbeeaaa49baf45718, not stripped

注意:我尝试将 --host=i686-linux-gnu--host=i686-pc-linux-gnu--host=i386-linux-gnu--host=i386-pc-linux-gnu 传递给 ./configure,但没有任何区别。