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

Embedded 在使用C而不使用OS的小型嵌入式系统中静态库与共享库(假设XIP),embedded,shared-libraries,static-libraries,Embedded,Shared Libraries,Static Libraries,没有RTOS/OS的小型嵌入式系统是否使用动态/共享库。我的理解是,使用它非常困难,不会产生任何效果 如果我们多次调用静态库中存在的API。API代码是否会放置在每个调用位置,如宏扩展或所有调用的代码/文本都是通用的。我认为代码/文本将是常见的 如果我为有多个API的.c文件创建了一个静态库,并且我将它与主文件静态链接,并且在主文件中只调用了一个API,那么我的问题是整个库是包含在final.bin中还是只包含特定的API代码中 从上面的问题中,你可以假设我缺少基本知识,所以任何人都可以提供相关

没有RTOS/OS的小型嵌入式系统是否使用动态/共享库。我的理解是,使用它非常困难,不会产生任何效果

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

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

从上面的问题中,你可以假设我缺少基本知识,所以任何人都可以提供相关链接来复习这些知识

问候
[编辑]

我试过做以下事情

加法.c模块

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

`size addition.o`   
23        0       0      23      17 addition.o    
乘法c模

`int multiplication(int a, int b)`  
`{`  
`int result;`  
`result = a * b;`  
`return result;`  
`}`
`size multiplication.o`  
21        0       0      21      15 multiplication.o  
创建了两者的对象文件并放入Archive中

ar cr libarith.a addition.o multiplication.o   
然后静态链接到我的主应用程序
示例.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  
`include“header.h”`
`#包括`
`1:int main()`
`2:{`  
`3:int结果;`
`4:结果=加法(1,2);`
`5:printf(“添加结果为:%d\n”,结果);`
`6:结果=乘法(3,2);`
`7:printf(“乘法结果是:%d\n”,result);`
`8:返回0;`
`9:}`
gcc-静态示例.c-L.-larith-o示例
示例的大小
51141192870525201217EFB9示例
注释了示例c的第6行
再次链接
gcc-静态示例.c-L-拉里斯-o示例
示例的大小
511109 1928 7052 520089 7ef99示例
以上两个之间的差异为32字节
这意味着加法。示例中不包括o

将加法.c和乘法.c模块合并为addmult.c,如下所示
整数加法(整数a、整数b)

{

int结果;

result=a+b;

返回结果;

}

整数乘法(整数a,整数b)

{

int结果;

result=a*b;

返回结果;

}

创建对象文件并放入存档
在此之前,我已删除了以前的存档
ar cr libarith.a addmult.o
现在对示例.c的第6行进行了注释
gcc-静态示例.c-L-拉里斯-o示例
尺寸示例
511093 1928 7052 520073 7ef89示例
示例c的未注释行nmber 6
尺寸示例 51141192870525201217EFB9示例

我的问题是,在这两种情况下,如果两个函数都被调用,那么最终文本大小是相同的,但如果只调用一个函数,那么差异是16 但是乘法。o的大小是23,所以明确地说,它没有被包括在内,但我们将如何证明16。
如果我错过了一些基本的东西

如果你真的有一个没有任何操作系统的嵌入式系统,那么你的硬件基本上有一个固定的软件,你只能通过物理手段(例如烙铁或插头等)来更改。在这种情况下,该软件运行在“裸铁”上,并以某种方式执行操作系统提供的操作(它管理物理资源,并通过适当的机器指令直接与I/O端口交互)

特别是,没有任何操作系统的嵌入式系统不能有任何类型的动态库,因为根据定义,这些库需要位于某些文件(在嵌入式处理器上)中,并且要有文件,您需要一个操作系统

什么是操作系统的确切定义是有争议的和模糊的;我相信提供文件系统是当前大多数操作系统的角色之一

由于共享库(或静态库)是位于某些文件中的库,因此在没有操作系统的情况下无法拥有它们。根据定义,提供文件的东西就是操作系统

也许您正在使用交叉开发链来开发嵌入式软件。如果你想得到在裸机上运行的东西,你的链必须最终给出一个二进制图像,你可以将其闪存到ROM中,然后将该ROM焊接或插入嵌入式硬件中,或者以某种方式进行物理传输(一些工具使你能够闪存整个独立的处理器)

我相信你可能会感到困惑,你应该读更多关于,,&

正如Clifford在评论中所建议的,您可以拥有一个带有一些文件系统和一些动态链接器的嵌入式系统;在我看来,这将是一个雏形的操作系统,但这是一个有争议的定义问题


请注意,创建动态链接器可能不是一件容易的任务(您需要这样做);您可以创建一个通用的动态加载程序,也可以限制动态加载模块的形式,或者使用特定的模块来生成它们。

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

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

因此,通过链接一个静态库,您不包括库中所有未使用的代码。你可以通过比较你所有的
unsigned int fun ( unsigned int a, unsigned int b )
{
 return(a/b);
}
c = fun(10,5);
c = 2;