如何满足 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
(当然)和 libncurses5
、libtinfo
和 libgpm
:
的 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
,但没有任何区别。
我想在 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
(当然)和 libncurses5
、libtinfo
和 libgpm
:
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
,但没有任何区别。