首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的可执行文件在链接后更大?

为什么我的可执行文件在链接后更大?
EN

Stack Overflow用户
提问于 2016-08-26 18:08:48
回答 2查看 230关注 0票数 2

我有一个小的C程序,我需要运行在不同的芯片上。可执行文件应该小于32 be。为此,我有几个工具链与不同的编译器为arm,mips等。

该程序由几个文件组成,每个文件被编译成一个对象文件,然后链接到一个可执行文件。

当我使用系统gcc (x86),我的可执行文件是15 my大。使用arm工具链,可执行文件的大小为65 is。对于另一个工具链,它是47 is。

例如,对于arm,可执行文件中包含的所有对象在一起都是14 in大。

这些对象使用以下选项进行编译:

代码语言:javascript
运行
复制
-march=armv7-m -mtune=cortex-m3 -mthumb -msoft-float -Os

用于链接下列选项:

代码语言:javascript
运行
复制
-s -specs=nosys.specs -march-armv7-m

nosys.specs库有274个字节大。

为什么当我的代码只有14 is,库只有274字节时,我的可执行文件仍然要大得多(65 is )?

更新:

根据答案的建议,我从代码中删除了所有malloc和printf命令,并删除了未使用的包含。此外,我还添加了编译标志-ffunction-sections -fdata-sections和链接标志--gc-sections,但是可执行文件仍然太大。

为了进行实验,我创建了一个虚拟程序:

代码语言:javascript
运行
复制
int main()
{
    return 1;
}

当我用不同的编译器编译程序时,我得到了非常不同的可执行文件大小:

代码语言:javascript
运行
复制
8.3 KB : gcc -Os
22 KB  : r2-gcc -Os
40 KB  : arm-gcc --specs=nosys.specs -Os
1.1 KB : avr-gcc -Os

那么,为什么我的手臂-gcc可执行这么大?我猜,avr-gcc的可执行文件也可以进行静态链接。

EN

回答 2

Stack Overflow用户

发布于 2016-08-26 18:15:13

您的x86可执行文件可能是动态链接的,因此您使用的任何标准库函数-- mallocprintf、string和数学函数等等--都不包含在二进制文件中。

ARM可执行文件是静态链接的,因此这些函数必须包含在二进制文件中。这就是它更大的原因。为了使其更小,您可能需要考虑使用-ffunction-sections -fdata-sections编译,然后与--gc-sections链接以丢弃二进制文件中的任何未使用的函数或数据。

( "nosys.specs库“不是一个库。这是一个配置文件。真正的库文件在其他地方。)

票数 6
EN

Stack Overflow用户

发布于 2016-09-01 07:23:44

嵌入式软件的移植依赖于目标硬件和软件平台。硬件平台分为单片机、cpus,可以运行linux操作系统。软件平台包括编译工具链和库。

对单片机和x86硬件平台的程序图像大小进行比较是毫无意义的。但是,使用不同的工具链来比较同一类型CPU上的程序映像大小是值得的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39172325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档