给定一个库模块,在下面的名为Runner
中,它作为可重用组件(不需要重新编译,即静态链接库)架构的 app partition ,而不是主分区。请注意,它仅包含main()
用于演示目的。
给出名为Callable
的其他模块/对象的集(顺序无关),即Callable1
,Callable2
和Callable3
,其中也作为可重用组件驻留在应用程序分区中。
Runner
对Callable
的运行时依赖性,Runner
需要知道这些Callable
中的每一个Runner
才能从中获取数据(访问权限)一个结构)或让它们执行一个操作(调用一个函数)。
Callable
不应对Callables
具有编译依赖性。相反,依赖关系应通过链接器注入虚构模块Callable
。
该概念不仅可用于托管环境,还可用于独立环境。因此,不能使用基于加载器的机制,例如在运行时将Callable
加载为共享对象。
我的工作解决方案是让Callables
在专用部分中定义指针,在本例中命名为Runner
,链接器将收集这些指针以便#ifndef CALLABLE_H
#define CALLABLE_H
typedef void (*Callable)(void);
#endif
1}}可以访问它,在链接时获取必要的信息。
#ifndef CALLABLES_H
#define CALLABLES_H
#include "Callable.h"
extern Callable Callables_start[];
extern Callable Callables_end[];
#endif
#include "Callables.h"
void Runner_run(void) {
for (Callable *callables = Callables_start; callables < Callables_end; callables++)
(*callables)();
}
int main(void) {
Runner_run();
return 0;
}
#include <stdio.h>
#include "Callable.h"
static void Callable1_call(void) {
printf("Callable 1\n");
}
static Callable thisCallable __attribute__((section("Callables"))) = &Callable1_call;
Callable2.c
除Callable3.c
中的其他消息外, printf()
和PROVIDE(Callables_start = LOADADDR(Callables));
PROVIDE(Callables_end = Callables_start + SIZEOF(Callables));
看起来相同。
CFLAGS+=--std=c99
callables:=Callable1 Callable2 Callable3
.PHONY: all
all: Runner
Runner: Callables.ld Runner.o $(addsuffix .o, $(callables))
$ make -s && ./Runner
Callable 1
Callable 2
Callable 3
-ffreestanding
输出显示解决方案有效,但我对解决方案不满意。 什么是替代方案,最好是使用链接器注入依赖关系的更好方法,而不是我找到的解决方案?
x86_64 上的环境 GCC / ld {{1}},但我对那些工具链不太具体/更便携的解决方案非常感兴趣比我到目前为止找到的解决方案。