最近对DPDK生成库做了一个封装,需要对log函数rte_log做一些修改,为了避免对原来的函数产生影响,因此在同文件下将该函数重新拷贝了一份,改名为rte_test_log(),在这个函数中修改。同时在h文件中添加了该函数的定义。
但在使用时,程序提示找不到该函数。
nm 有这个函数,但就是ld不过,奇怪啊
经过一番分析与资料查找,发现DPDK的编译利用了ld的--version-script编译选项,
该选项的作用就是指定一个文件,将动态库中需要导出的函数写入动态库中,
而其他未写入的函数只能内部可见,外部无法调用。
例如在rte_eal_version.map文件中定义了:
DPDK_2.0 {
global:
__rte_panic;
devargs_list;
... ...
rte_log;
... ...
local: *;
};
因此,如果要在外部使用新定义的xxx_eal_init()函数,还需要修改该文件,添加这个函数:
DPDK_2.0 {
global:
__rte_panic;
devargs_list;
... ...
rte_log;
rte_test_log;
... ...
local: *;
};
重新编译DPDK,会发现外部已经可以调用该函数了:
关于ld的--version-script编译选项,网上已经有很多资料,这里不再复述。
但这个需要手动加,多的时候怎么办了??