在不同系统上编译得到的二进制文件大小是 20 倍。为什么?

在不同系统上编译得到的二进制文件大小是 20 倍。为什么?

将开发切换到新系统。去 GitHub 上接手了这个项目,但得到的项目比我旧系统上的项目新了大约 2 个月。虽然新版 GitHub 中只有微小的变化,但可执行文件的大小却有很大差异。我假设新版本包含调试信息。由于 make 文件是在设置期间构建的,我将旧的 make 文件复制到了新系统,但运行 make 后构建的可执行文件的大小相同。

jstateson@jysdualxeon:~/boinc$ uname -a
Linux jysdualxeon 5.0.0-32-generic #34~18.04.2-Ubuntu SMP Thu Oct 10 10:36:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
jstateson@jysdualxeon:~/boinc/client$ ls -l boinc
-rwxr-xr-x 2 root root 20075752 Nov  9 08:57 boinc
jstateson@jysdualxeon:~/boinc/client$


jstateson@jyslinux1:~/Downloads/boinc-master/client$ uname -a
Linux jyslinux1 5.0.0-32-generic #34~18.04.2-Ubuntu SMP Thu Oct 10 10:36:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
jstateson@jyslinux1:~/Downloads/boinc-master/client$ ls -l boinc
-rwxrwxr-x 2 jstateson jstateson 1517832 Nov  1 01:22 boinc
jstateson@jyslinux1:~/Downloads/boinc-master/client$

[编辑] 我不知道是什么原因造成的,但我通过从旧开发系统中打包我现有的项目并在新系统上解包,然后执行大量复制 *.cpp *.h 以将源代码放入“新”git 工作区来修复了这个问题。构建结果大小正确,并且代码正确。

我有兴趣发现是什么原因造成的。到目前为止,项目维护者还没有回应,但他们都是志愿者,所以我想自己找出发生了什么。我猜它是为静态而不是动态构建的?这只是一个猜测,因为我曾经在 Windows 系统上这样做过。新手问题:gcc 是否有像 visual studio 这样的可视化调试器,可以构建巨大的调试文件?我从来没有调试过任何 Linux 代码,除了输入一堆控制台打印来查看到底发生了什么。也许自从我在 2009 年退休以来,情况发生了变化,我错误地构建了一个可视化 gnu 调试版本???

[按照要求]

jstateson@jysdualxeon:~/boinc/client$ file boinc
boinc: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=753642cbdfe8381bf86e41d736eece30774dd318, with debug_info, not stripped

在旧系统(工作系统)和新系统(尺寸太大)中,对“-strip-debug”的 grep 显示相同,例如都显示以下内容

libtool:old_striplib="strip --strip-debug"

解决方案:在我的程序上运行该剥离工具,效果很好。仍然不知道调试内容是如何进入的,但我确实将问题追溯到我获得软件的地方

如果 $ac_cv_prog_cc_g 等于“yes”,则我得到调试“-g O2”该变量在 configure 中设置为 YES 或 NO,configure 由“_autosetup”创建,但我在 _autosetup 中找不到该变量。在文件夹“x”中,如果我运行 autosetup,我会得到“-O3”,这很好在文件夹“y”中,如果我运行 autosetup,我会得到“-g O2”,这很糟糕文件夹 x 来自从 GitHub 下载的“zip”,文件夹 Y 来自 git clonehttps://github.com/Y 所以看起来是有区别的。不确定它藏在哪里,但至少我知道如何从可执行文件中剥离调试内容。

相关内容