16

我在 Linux 上使用 MinGW 交叉编译到 Windows。让这项工作变得轻而易举。不过,用所需的 DLL 打包它并不是那么简单。目前的解决方案是在 Windows 上运行可执行文件并复制 DLL 直到它实际运行。

是否有适用于 Linux 的工具列出我的 Windows .exe 所需的 DLL?(类似于lddDependencyWalker 的组合。)

4

4 回答 4

21

截至 2015 年底,没有工具链实用程序支持列出 Windows 二进制文件的动态依赖项(例如 ldd 或 otool)。

从我的测试中,通常可以看到完整的依赖项列表,例如:

strings MY.EXE | grep -i '\.dll$'

Hackish,但它一直对我有用。

举个完整的例子,试试我在 linux 上的交叉环境中使用的这个脚本。

于 2015-10-16T15:28:47.363 回答
5

检查您的实用程序是否支持带有objdump --help. 如果没有,请为 MinGW 安装交叉编译器工具集(如https://packages.debian.org/sid/mingw-w64)。

比看:

objdump --private-headers $EXE
于 2019-11-02T13:27:38.483 回答
4
$ objdump -p program.exe | grep "DLL Name:"
        DLL Name: KERNEL32.dll
        DLL Name: msvcrt.dll

FWIW 可以使用objdumpwith -p(or -x) 选项。这比筛选“.dll”字符串要好得多,因为它很可能会产生很多误报。

于 2021-04-01T22:51:35.653 回答
0
    #!/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
于 2019-08-24T23:07:20.210 回答