Assembly 我可以动态链接具有重复函数名的库吗?

Assembly 我可以动态链接具有重复函数名的库吗?,assembly,compilation,linker,dynamic-linking,Assembly,Compilation,Linker,Dynamic Linking,假设Library1.so和Library2.so具有: 情况: 我想在Library1中使用func1()和glob\u data1, 同时在Library2中使用func2()和glob_data2。 问题: 当我动态链接这些库时,如何才能做到这一点? (如果在C级上没有方法,在汇编级上有可能的方法吗?如果这些符号不打算在库之外使用,您可以简单地将它们标记为\u属性((可见性(“隐藏”))(或者更好地使用-fvisibility=hidden编译代码,并使用\u属性注释公共函数)((可

假设Library1.so和Library2.so具有:


情况:
我想在Library1中使用
func1()
glob\u data1

同时在Library2中使用
func2()
glob_data2



问题:
当我动态链接这些库时,如何才能做到这一点?

(如果在C级上没有方法,在汇编级上有可能的方法吗?

如果这些符号不打算在库之外使用,您可以简单地将它们标记为
\u属性((可见性(“隐藏”))
(或者更好地使用
-fvisibility=hidden
编译代码,并使用
\u属性注释公共函数)((可见性(“默认”))

如果这些函数必须保持公共,您可以使用
-symbolic
标志链接LIB。这将导致链接器在可能的情况下解析对本地定义(而不是PLT存根)的引用


请注意,
-symbol
适用于所有库符号。对于使用符号别名的符号子集,可以实现相同的效果,但这更复杂,因此除非您真的需要,否则我不想详细介绍。

如果这些符号不打算在库之外使用,您只需将它们标记为
\u即可属性((可见性(“隐藏”))
(或者更好地使用
-fvisibility=hidden
编译代码,并使用
\uu属性((可见性(“默认”)))
注释公共函数)

如果这些函数必须保持公共,您可以使用
-symbolic
标志链接LIB。这将导致链接器在可能的情况下解析对本地定义(而不是PLT存根)的引用

请注意,
-symbol
适用于所有库符号。使用符号别名可以为符号子集实现相同的效果,但这更复杂,因此除非您确实需要,否则我不想详细介绍

假设
Library1.so
Library2.so
有:
func1(),func2(),glob_数据1,glob_数据2

在Linux(和其他UNIX系统)上,将这两个库加载到单个进程通常是一个非常糟糕的主意

例如,当来自
library1
func1
调用
func2
时,调用哪个
func2
?答案取决于库的链接方式、加载方式以及顺序

如果函数不调用任何其他导出符号,则可以通过从
dlopen
dlsym
获取的函数指针调用它们:

void *h1 = dlopen("Library1.so", RTLD_LOCAL|RTLD_LAZY);
int (*f1L1)(void) = dlsym(h1, "func1");

void *h2 = dlopen("Library2.so", RTLD_LOCAL|RTLD_LAZY);
int (*f1L2)(void) = dlsym(h2, "func1");

printf("func1 from Library1 returns %d\n", f1L1());
printf("func1 from Library2 returns %d\n", f1L2());
假设
Library1.so
Library2.so
有:
func1(),func2(),glob_数据1,glob_数据2

在Linux(和其他UNIX系统)上,将这两个库加载到单个进程通常是一个非常糟糕的主意

例如,当来自
library1
func1
调用
func2
时,调用哪个
func2
?答案取决于库的链接方式、加载方式以及顺序

如果函数不调用任何其他导出符号,则可以通过从
dlopen
dlsym
获取的函数指针调用它们:

void *h1 = dlopen("Library1.so", RTLD_LOCAL|RTLD_LAZY);
int (*f1L1)(void) = dlsym(h1, "func1");

void *h2 = dlopen("Library2.so", RTLD_LOCAL|RTLD_LAZY);
int (*f1L2)(void) = dlsym(h2, "func1");

printf("func1 from Library1 returns %d\n", f1L1());
printf("func1 from Library2 returns %d\n", f1L2());

你在为什么操作系统编程?@fuz-Oh我错过了,我使用Linux。你在为什么操作系统编程?@fuz-Oh我错过了,我使用Linux。希望库使用
隐藏的
别名导出函数,所以库内的内部调用不会通过PLT/符号插入机制。(因此效率更高)。但是,有些没有。希望库为导出的函数使用
隐藏的
别名,因此库中的内部调用不会通过PLT/符号插入机制(因此效率更高)。但是,有些没有。