构建了一个发布的Linux共享对象,大小为28MB

28681504 Feb  6 19:46 libmtcrypto.so

它是使用此部分命令创建的,其中包括OpenSSL、Boost和许多其他库

/usr/bin/c++ -fPIC -O2 -g -DNDEBUG -shared -Wl,-soname,libmtcrypto.so -o lib/libmtcrypto.so ...

如此大的二进制代码让人不禁要问:"对于一个只导出一个函数的简单共享对象来说,它为什么这么大?"

我怀疑是这些OpenSSL档案(42MB和7MB)

bloat

Question

有没有办法确定哪个代码库使共享对象inflating ?

Update

根据 comments ,它似乎与添加的所有符号和调试信息有关.我运行了建议的命令:

strip libmtcrypto.so

并将共享对象从28MB减少到5MB!

5634592 Feb  6 20:25 libmtcrypto.so*

构建系统正在添加-g选项,所以我会联系这些人将其从发布版本中删除.

谢谢!

推荐答案

有没有办法确定哪个代码库使共享对象inflating ?

是的,有一个工具可以准确地进行这种分析:Bloaty McBloatface: a size profiler for binaries.

这很可能是由于所有的调试信息造成的.正在运行

strip -g libmtcrypto.so -o libmtcrypto-stripped.so
ls -l libmtcrypto-stripped.so

很容易证明(或反驳)这一猜测.

Linux相关问答推荐

awk:try 将时间戳字符串转换为unix纪元时间

IntelliJ(PyCharm)不再识别Linux中的AltGr快捷键

Linux 'column' 实用程序的使用

如何在 ERE 中结束这个正则表达式

无法在嵌入式 Linux 中使用 libjpeg 以 RGB888 在 LCD(黑色)上显示 JPEG

在 Rust 中重命名主线程

使用ansible配置Linux VM使用vmware_vm_shell模块时变成su?

如何在不进行轮询且不吃掉其他人子进程的退出代码的情况下等待一组子进程(并且只有它们)?

使用 awk 将多行文本转换为 CSV

为什么 printf 仍然可以使用低于 XMM 寄存器中 FP args 数量的 RAX?

为什么 perf 不报告缓存未命中?

具体来说,fork() 如何处理 Linux 中 malloc() 动态分配的内存?

crontab 命令单独一行

Linux批量转换:使用转换更改jpg的质量但保留其名称

将原始数据发送到 TCP 服务器的 Linux 工具

从文本文件中删除奇数行或偶数行

Linux命令将一个文件复制到多个文件

Postgresql -bash:psql:找不到命令

如何自动启动 Solr?

如何在 docker 容器中运行 cron 作业(job)