Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
纯C中链接器节的替换_C_Linux_Linker_Cross Platform - Fatal编程技术网

纯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文件中,然后您可以从主程序访问该文件。我也考虑过脚本,甚至还考虑过修补源代码,但显然这对我来说太粗糙了。谢谢大家的反馈!