纯C中链接器节的替换
我很抱歉,如果这篇文章的标题不完全适合下面的内容 在我当前的项目中,我有不同的纯C中链接器节的替换,c,linux,linker,cross-platform,C,Linux,Linker,Cross Platform,我很抱歉,如果这篇文章的标题不完全适合下面的内容 在我当前的项目中,我有不同的.c文件(即*controller\u 1.c*、controller\u 2.c和main.c)。每个“控制器”文件都使用一个宏来定义“控制器”结构。此结构将在最终可执行文件中的特定部分结束。以下是宏: #define CONTROLLER_START(_name) \ static struct controller controller_##_name
.c
文件(即*controller\u 1.c*
、controller\u 2.c
和main.c
)。每个“控制器”文件都使用一个宏来定义“控制器”结构。此结构将在最终可执行文件中的特定部分结束。以下是宏:
#define CONTROLLER_START(_name) \
static struct controller controller_##_name \
__attribute__(( \
__used__, \
__section__("controllers"), \
__aligned__(__alignof__(struct controller)))) = { \
.name = #_name,
#define CONTROLLER_END, \
};
这个很好的技巧(在Linux内核中使用)允许我编译我的项目并在运行时“发现”不同的控制器。我只需要指向控制器部分的开头,然后循环浏览所有这些部分。我遇到的问题是,尽管这在Linux、Windows和OSX下都能工作,但这项技术很难或不可能在其他操作系统(或通过我尝试过的Emscripten)上实现
我想在根本不使用链接器脚本的情况下重新实现这一部分。目标是避免在我解析这些结构的.c
文件中使用externs,当然也避免include(我可以有数百个这样的控制器文件)。我不确定这是否可行,但是一些关于堆栈溢出的人可能知道一个类似的技巧,它更便于携带
谢谢大家! 简单的答案是:你不能。这就是linux内核和其他项目使用此部分技巧的原因。您可以使用编译器扩展,如构造函数。或者,您可以修改该部分技巧,使其在大多数操作系统上都能工作。但是在纯C语言中没有办法做到这一点
我有一个黑客设置的部分,用于与MacOS和大多数类unix系统与ELF和a.out一起工作。但是,这是你能做的最好的。如果你可以使用C++,你可以使用构造函数在启动期间登记控制器。如果在中使用“constructor”函数属性,也可以在C中这样做GCC@dsi当前位置虽然它可能有效,但这是一个非常丑陋的“解决方案”。它正在用全局状态替换基本上是常量的表。当然,还有各种各样令人讨厌的问题,比如,在部分或所有注册CTOR运行之前,其他CTOR可能会运行。@R。。您可以使用构造函数将控制器注册(插入)到链接列表中(即具有指向第一个的全局指针)。顺序并不重要。例如,实际的处理将稍后在main()内完成,在此之前,无论如何都不应该使用这些控制器。不过我明白你的意思了。谢谢大家。我已经在OSX、Linux和Windows下完成了这项工作。我对Emscripten和移动操作系统(主要是Android和iOS)感兴趣。构造函数是否为这些目标工作?@ USER 1995 548,它应该工作(它肯定会与C++构造函数,也可能是C)一起工作。显然,另一个选择是编写一个工具(例如脚本),将所有控制器枚举到一个包含指针数组的C文件中,然后您可以从主程序访问该文件。我也考虑过脚本,甚至还考虑过修补源代码,但显然这对我来说太粗糙了。谢谢大家的反馈!