使用C而不使用OS的小型嵌入式系统中的静态与共享库(假设为XIP)

Dev*_*Dev 2 embedded shared-libraries static-libraries

没有RTOS/OS的小型嵌入式系统是否使用动态/共享库.我的理解是,使用它非常困难,而且效率不高.

如果我们多次调用一个静态库中存在的API.API代码是否会放置在每个调用位置,如宏扩展或代码/文本将是所有调用的通用位置.我认为代码/文本很常见.

如果我为具有多个API的.c文件创建了静态库,并且我将其与主文件静态链接,并且在主文件中只调用了一个API,那么我的问题是整个库是否包含在最终的.bin中或仅特定的API代码.

从上面的问题,你可以假设我缺少基本面本身,所以任何人都可以提供相关的链接来刷这些.

问候
[编辑]

我试过以下事情

addition.c模块

`int addition(int a,int b)`  
`{`  
`int result;`  
`result = a + b;`  
`return result;`  
`}`

`size addition.o`   
23        0       0      23      17 addition.o    
Run Code Online (Sandbox Code Playgroud)

multiplication.c模块

`int multiplication(int a, int b)`  
`{`  
`int result;`  
`result = a * b;`  
`return result;`  
`}`
`size multiplication.o`  
21        0       0      21      15 multiplication.o  
Run Code Online (Sandbox Code Playgroud)

创建了两者的目标文件并放入了archieve

ar cr libarith.a addition.o multiplication.o   
Run Code Online (Sandbox Code Playgroud)

然后静态链接到我的主应用程序
example.c模块

`#include "header.h"`  
`#include <stdio.h>`  
`1:int main()`  
`2:{`  
`3:int result;`  
`4:result = addition(1,2);`  
`5:printf("addition result is : %d\n",result);`  
`6:result = multiplication(3,2);`  
`7:printf("multiplication result is :  %d\n",result);`  
`8:return 0;`  
`9:}`

gcc -static example.c -L. -larith -o example  

size of example  
511141     1928    7052  520121   7efb9 example  
Run Code Online (Sandbox Code Playgroud)

注释了example.c的第6行,
并再次链接了
gcc -static example.c -L.-larith -o示例
大小示例
511109 1928 7052 520089 7ef99示例
上述两个字节之间的32个字节,
这意味着addition.o不包含在示例中

将add.c和multiplication.c两个模块合并为addmult.c,如下所示
int addition(int a,int b)
{
int result;
result = a + b;
return result;
}
int multiplication(int a, int b)
{
int result;
result = a * b;
return result;
}

在创建目标文件并放入archieve
之前我已经删除了之前的
archieve ar cr libarith.a addmult.o
现在注释了example.c的第6行
gcc -static example.c -L.-larith -o example
size example
511093 1928 7052 520073 7ef89示例
uncommented line nmber 6 of example.c
size example 511141 1928 7052 520121 7efb9示例

我的问题是,在两种情况下,如果两个函数都被称为最终文本大小相同,但如果只调用一个函数,则存在16的差异,但乘法.尺寸为23,因此确定它不包括在内但我们将如何证明16.如果我错过了一些基本的东西?

Cli*_*ord 5

要在运行时动态加载和链接库,需要使用代码来执行加载/链接操作.该功能通常是操作系统的一部分.此外,在没有某种大容量存储的系统中,动态链接没有任何好处,因为动态链接的代码在任何情况下都必须存在于存储器中,因此也可能是静态链接的.

要回答问题的第二部分,静态库只是归档中目标文件的集合.链接器将仅提取和链接解析可执行文件中引用的符号所需的对象代码.一些智能链接器可以从目标文件中丢弃未使用的函数,但您不应该依赖它.

因此,通过链接静态库,您不会在库中包含所有未使用的代码.您可以通过将所有库文件的大小与可执行二进制文件的大小进行比较来判断,您可能会发现可执行文件远小于链接库大小的总和.此外,您的链接器将有一个选项来创建一个映射文件,该文件将准确地告诉您包含的代码,以及它是否具有交叉引用输出工具,引用或引用的代码.

如果您正在构建自己的静态库,甚至是您自己的非库代码,那么它将支付以确保在目标文件级别具有良好的粒度.例如,如果一个目标文件包含两个函数,一个使用,一个未使用,大多数链接器别无选择,只能包含两个,而如果函数是在单独的编译单元(源文件)中定义的,那么它们将在单独的目标文件中(即使在整理成图书馆时)也可以单独链接.