C 如何创建链接器仅链接程序使用的函数的库?

C 如何创建链接器仅链接程序使用的函数的库?,c,gcc,microcontroller,avr,avr-gcc,C,Gcc,Microcontroller,Avr,Avr Gcc,我正在为8位AVR微控制器(AVR-GCC)编译一个应用程序。为了减少微控制器中闪存的使用,链接器必须只链接应用程序代码使用的功能。我正在写我自己的图书馆,我遇到了以下声明 “每个代码模块编写一个函数。这将编译为每个对象模块一个函数”-来源: 这是什么意思?如何为每个函数创建单独的对象文件?现在我的库中只有一个.h文件和一个.c文件。“每个代码模块一个函数”表示每个c源文件一个函数。这将为每个函数提供一个对象文件 这似乎很尴尬,使用GCC时的典型方法是: 使用-fdata sections-ff

我正在为8位AVR微控制器(AVR-GCC)编译一个应用程序。为了减少微控制器中闪存的使用,链接器必须只链接应用程序代码使用的功能。我正在写我自己的图书馆,我遇到了以下声明

“每个代码模块编写一个函数。这将编译为每个对象模块一个函数”-来源:

这是什么意思?如何为每个函数创建单独的对象文件?现在我的库中只有一个.h文件和一个.c文件。

“每个代码模块一个函数”表示每个c源文件一个函数。这将为每个函数提供一个对象文件

这似乎很尴尬,使用GCC时的典型方法是:

  • 使用
    -fdata sections-fffunction sections
    选项编译,这些选项告诉GCC将数据和函数放在单独的部分中。节只是对象文件中的一个概念,基本上是一个独立的区域。单个对象文件可以包含多个节
  • 然后链接到
    --gc sections
    ,告诉链接器垃圾收集未使用的节。这将删除死代码

  • 为每个函数编写一个.c文件。但现代的链接器无论如何都能执行“功能级链接”(google that),所以你不需要“为每个代码模块编写一个函数”。有时创建一个对象库,工具链只会提取它所需要的,有时链接不在库中的对象,这需要一切。但这是非常多的工具链,可能是特定于版本的。因此我必须在每个c文件中编写一个函数,并为所有这些c文件创建一个头文件?不是按照我建议的方式,不。仅供参考,如果您将
    -Wl,--print gc sections
    添加到
    -Wl,--gc sections
    ,链接器将打印它抛出的所有节。这有助于了解它的实际功能。