我在 Linux 上使用 MinGW 交叉编译到 Windows。让这项工作变得轻而易举。不过,用所需的 DLL 打包它并不是那么简单。目前的解决方案是在 Windows 上运行可执行文件并复制 DLL 直到它实际运行。
是否有适用于 Linux 的工具列出我的 Windows .exe 所需的 DLL?(类似于ldd
DependencyWalker 的组合。)
我在 Linux 上使用 MinGW 交叉编译到 Windows。让这项工作变得轻而易举。不过,用所需的 DLL 打包它并不是那么简单。目前的解决方案是在 Windows 上运行可执行文件并复制 DLL 直到它实际运行。
是否有适用于 Linux 的工具列出我的 Windows .exe 所需的 DLL?(类似于ldd
DependencyWalker 的组合。)
截至 2015 年底,没有工具链实用程序支持列出 Windows 二进制文件的动态依赖项(例如 ldd 或 otool)。
从我的测试中,通常可以看到完整的依赖项列表,例如:
strings MY.EXE | grep -i '\.dll$'
Hackish,但它一直对我有用。
举个完整的例子,试试我在 linux 上的交叉环境中使用的这个脚本。
检查您的实用程序是否支持带有objdump --help
. 如果没有,请为 MinGW 安装交叉编译器工具集(如https://packages.debian.org/sid/mingw-w64)。
比看:
objdump --private-headers $EXE
$ objdump -p program.exe | grep "DLL Name:"
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
FWIW 可以使用objdump
with -p
(or -x
) 选项。这比筛选“.dll”字符串要好得多,因为它很可能会产生很多误报。
#!/bin/sh
notfounddlls='KERNEL32.dll'
dllbase=/usr/x86_64-w64-mingw32
nc=1
while [ $nc -gt 0 ];
do
nc=0
for f in *.exe *.dll
do
for dep in $(strings $f | grep -i '\.dll$')
do
if [ ! -e $dep ]; then
echo $notfounddlls | grep -iw $dep > /dev/null
if [ $? -ne 0 ]; then
dllloc=$(find $dllbase -iname $dep)
if [ ! -z $dllloc ]; then
cp $dllloc .
echo "Copying "$(basename $dllloc)
nc=$(($nc + 1))
else
notfounddlls="$notfounddlls $dep"
fi
fi
fi
done
done
done
echo "System DLLS: "$notfounddlls