我有一个小的C程序,我需要运行在不同的芯片上。可执行文件应该小于32 be。为此,我有几个工具链与不同的编译器为arm,mips等。
该程序由几个文件组成,每个文件被编译成一个对象文件,然后链接到一个可执行文件。
当我使用系统gcc (x86),我的可执行文件是15 my大。使用arm工具链,可执行文件的大小为65 is。对于另一个工具链,它是47 is。
例如,对于arm,可执行文件中包含的所有对象在一起都是14 in大。
这些对象使用以下选项进行编译:
-march=armv7-m -mtune=cortex-m3 -mthumb -msoft-float -Os
用于链接下列选项:
-s -specs=nosys.specs -march-armv7-m
nosys.specs库有274个字节大。
为什么当我的代码只有14 is,库只有274字节时,我的可执行文件仍然要大得多(65 is )?
更新:
根据答案的建议,我从代码中删除了所有malloc和printf命令,并删除了未使用的包含。此外,我还添加了编译标志-ffunction-sections -fdata-sections
和链接标志--gc-sections
,但是可执行文件仍然太大。
为了进行实验,我创建了一个虚拟程序:
int main()
{
return 1;
}
当我用不同的编译器编译程序时,我得到了非常不同的可执行文件大小:
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的可执行文件也可以进行静态链接。
发布于 2016-08-26 18:15:13
您的x86可执行文件可能是动态链接的,因此您使用的任何标准库函数-- malloc
、printf
、string和数学函数等等--都不包含在二进制文件中。
ARM可执行文件是静态链接的,因此这些函数必须包含在二进制文件中。这就是它更大的原因。为了使其更小,您可能需要考虑使用-ffunction-sections -fdata-sections
编译,然后与--gc-sections
链接以丢弃二进制文件中的任何未使用的函数或数据。
( "nosys.specs库“不是一个库。这是一个配置文件。真正的库文件在其他地方。)
发布于 2016-09-01 07:23:44
嵌入式软件的移植依赖于目标硬件和软件平台。硬件平台分为单片机、cpus,可以运行linux操作系统。软件平台包括编译工具链和库。
对单片机和x86硬件平台的程序图像大小进行比较是毫无意义的。但是,使用不同的工具链来比较同一类型CPU上的程序映像大小是值得的。
https://stackoverflow.com/questions/39172325
复制相似问题