欢迎来到 DPDK交流社区 ,有什么问题可以尽管在这里提问,您将会收到社区其他成员的回答;也可以将您的总结写在这里,为社区其他成员提供帮助。 (QQ交流群:127163755)

为DPDK动态库添加新的导出函数问题

+4 投票

最近对DPDK生成库做了一个封装,需要对初始化函数rte_eal_init()做一些修改,

为了避免对原来的函数产生影响,因此在同文件下将该函数重新拷贝了一份,

改名为xxx_eal_init(),在这个函数中修改。同时在rte_eal.h文件中添加了该函数的定义。

但在使用时,程序提示找不到该函数。

用readelf程序查看,发现该函数没有导出:

默认的rte_eal_init()函数:

$ readelf -a build/lib/libdpdk.so | grep rte_eal_init

534: 0000000000037250 1923 FUNC GLOBAL DEFAULT 12 rte_eal_init@@DPDK_2.0

4751: 0000000000037250 1923 FUNC GLOBAL DEFAULT 12 rte_eal_init

新添加的xxx_eal_init()函数:

$ readelf -a build/lib/libdpdk.so | grep xxx_eal_init

3851: 0000000000036c20 1573 FUNC LOCAL DEFAULT 12 xxx_eal_init

 

经过一番分析与资料查找,发现DPDK的编译利用了ld的--version-script编译选项,

该选项的作用就是指定一个文件,将动态库中需要导出的函数写入动态库中,

而其他未写入的函数只能内部可见,外部无法调用。

例如在rte_eal_version.map文件中定义了:

DPDK_2.0 {

global:

 

__rte_panic;

devargs_list;

... ...

rte_eal_init;

... ...

 

local: *;

};

因此,如果要在外部使用新定义的xxx_eal_init()函数,还需要修改该文件,添加这个函数:

DPDK_2.0 {

global:

 

__rte_panic;

devargs_list;

... ...

rte_eal_init;

xxx_eal_init;

... ...

 

local: *;

};

重新编译DPDK,会发现外部已经可以调用该函数了:

$ readelf -a build/lib/libdpdk.so | grep xxx_eal_init

633: 0000000000036c50 1573 FUNC GLOBAL DEFAULT 12 xxx_eal_init@@DPDK_2.0

4880: 0000000000036c50 1573 FUNC GLOBAL DEFAULT 12 xxx_eal_init

关于ld的--version-script编译选项,网上已经有很多资料,这里不再复述。

QQ交流群:127163755

欢迎大家进群交流。

最新提问 9月 2, 2016 分类:经验之谈 | 用户: sysight (10,220 分)

登录 或者 注册 后回答这个问题。

...