C中的N依赖注入 - 比链接器定义的数组更好的方式?

时间:2014-12-19 19:00:58

标签: c design-patterns gcc dependency-injection linker

给定一个库模块,在下面的名为Runner中,它作为可重用组件(不需要重新编译,即静态链接库)架构的 app partition ,而不是主分区。请注意,它仅包含main()用于演示目的。

给出名为Callable的其他模块/对象的(顺序无关),即Callable1Callable2Callable3,其中也作为可重用组件驻留在应用程序分区中。

RunnerCallable的运行时依赖性,Runner需要知道这些Callable中的每一个Runner才能从中获取数据(访问权限)一个结构)或让它们执行一个操作(调用一个函数)。

Callable不应对Callables具有编译依赖性。相反,依赖关系应通过链接器注入虚构模块Callable。 该概念不仅可用于托管环境,还可用于独立环境。因此,不能使用基于加载器的机制,例如在运行时将Callable加载为共享对象。

如何使用链接器注入依赖项?

我的工作解决方案是让Callables在专用部分中定义指针,在本例中命名为Runner,链接器将收集这些指针以便#ifndef CALLABLE_H #define CALLABLE_H typedef void (*Callable)(void); #endif 1}}可以访问它,在链接时获取必要的信息。

Callable.h

#ifndef CALLABLES_H
#define CALLABLES_H
#include "Callable.h"
extern Callable Callables_start[];
extern Callable Callables_end[];
#endif

Callables.h

#include "Callables.h"
void Runner_run(void) {
    for (Callable *callables = Callables_start; callables < Callables_end; callables++)
        (*callables)();
}
int main(void) {
    Runner_run();
    return 0;
}

Runner.c

#include <stdio.h>
#include "Callable.h"
static void Callable1_call(void) {
    printf("Callable 1\n");
}
static Callable thisCallable __attribute__((section("Callables"))) = &Callable1_call;

Callable1.c

Callable2.c
Callable3.c中的其他消息外,

printf()PROVIDE(Callables_start = LOADADDR(Callables)); PROVIDE(Callables_end = Callables_start + SIZEOF(Callables)); 看起来相同。

Callables.ld

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}},但我对那些工具链不太具体/更便携的解决方案非常感兴趣比我到目前为止找到的解决方案。

0 个答案:

没有答案