2016-11-21 54 views
0

我想将Ubuntu 16.04(例如zbackup)上的程序编译为可以在BusyBox Linux上运行的单个fat二进制文件。使用定制的CMAKE脚本,我将以下选项链接起来,这些选项似乎使二进制增长到4MB +。这没关系,似乎事情正在被推向二进制。glibc链接导致更小的二进制文件被破坏

-lcrypto 
    -lz 
    -ldl 
    -static-libstdc++ 
    -static-libgcc 

接下来,我尝试添加-static标志,这样我可以包括但其中缺少最后一块时,我添加了-static选项,然后重新编译的二进制是在大约2MB +实际上更小,它是坏了。当我尝试运行二进制文件时,它只是说file or folder not found

我似乎无法确定为什么-static选项导致输出二进制文件被破坏。

+0

在你的构建中,你有没有像warning这样的警告:“警告:在静态链接的应用程序中使用'dlopen'需要在运行时从glibc版本的共享库用于链接”? – Eric

+0

用-static做一个'objdump -t',一个用二进制不做,然后做一个diff。这听起来像-static导致libstdC++和libgcc不能链接进来。 – user2766918

+0

@eric当在目标busybox上运行工作二进制文件(不带-static)时,它会给出错误'/lib/libc.so.6:version 'GLIBC_2.7'找不到',但只是没有找到破损的二进制文件或文件夹(使用-static)。编译时CMAKE不显示任何错误输出。 @ user2766918 objdump的输出对于这两个文件都很大。不知道从哪里开始的差异显示的文本山(约10页) – pieterk

回答

1

从海湾合作委员会手册页:

-static在支持动态链接系统,这样可以防止与共享库进行链接。在其他系统上,该选项没有 的影响。

因此,它阻止了链接到一些共享库,这是什么打破了你,可能是什么使它更小。可能它没有链接到加密库等。再次使用objdump -t之前和之后,并找出哪些符号正在消失。