在Linux中,GNU标准C库的共享库(libc.so)不仅是一个共享库,还可以作为独立的可执行文件运行,打印出版本信息:[me@computer~]$/lib/libc.so.6GNUCLibrarystablereleaseversion2.12,byRolandMcGrathetal.Copyright(C)2010FreeSoftwareFoundation,Inc.Thisisfreesoftware;seethesourceforcopyingconditions.ThereisNOwarranty;notevenforMERCHANTABILITYorFITNESSFOR
如何更改函数在运行时加载的库?例如,假设我想用新的东西替换标准的printf函数,我可以编写自己的版本并将其编译到共享库中,然后将“LD_PRELOAD=/my/library.so"在运行我的可执行文件之前在环境中。但是,我想从程序本身内部更改该链接。这肯定是可能的……对吧?编辑不,以下内容不起作用(但如果你能告诉我如何让它起作用,那就足够了)。void*mylib=dlopen("/path/to/library.so",RTLD_NOW);printf=dlsym(mylib,"printf"); 最佳答案 据我所知,这是不可
如何更改函数在运行时加载的库?例如,假设我想用新的东西替换标准的printf函数,我可以编写自己的版本并将其编译到共享库中,然后将“LD_PRELOAD=/my/library.so"在运行我的可执行文件之前在环境中。但是,我想从程序本身内部更改该链接。这肯定是可能的……对吧?编辑不,以下内容不起作用(但如果你能告诉我如何让它起作用,那就足够了)。void*mylib=dlopen("/path/to/library.so",RTLD_NOW);printf=dlsym(mylib,"printf"); 最佳答案 据我所知,这是不可
我有一个应用程序依赖于过多的库(不是我们都依赖)。大多数这些库都是通过包管理器安装的。对于那些不是的,我重新编译了它们,但我仍然得到相同的libpng不兼容错误。libpngwarning:Applicationwascompiledwithpng.hfromlibpng-1.2.44libpngwarning:Applicationisrunningwithpng.cfromlibpng-1.4.3这是一个错误,因为生成的缓冲区是空的。我如何知道哪个库链接到新库,哪个库链接到旧库?ldd...libpng12.so.0=>/lib/x86_64-linux-gnu/libpng12.
我有一个应用程序依赖于过多的库(不是我们都依赖)。大多数这些库都是通过包管理器安装的。对于那些不是的,我重新编译了它们,但我仍然得到相同的libpng不兼容错误。libpngwarning:Applicationwascompiledwithpng.hfromlibpng-1.2.44libpngwarning:Applicationisrunningwithpng.cfromlibpng-1.4.3这是一个错误,因为生成的缓冲区是空的。我如何知道哪个库链接到新库,哪个库链接到旧库?ldd...libpng12.so.0=>/lib/x86_64-linux-gnu/libpng12.
是否有任何编程方式(系统调用?)来列出Linux上的共享库依赖项?而不是使用ldd... 最佳答案 readelf-Walib.so|grepNEEDED 关于linux-linux上列出共享库依赖的编程方式,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6660745/
是否有任何编程方式(系统调用?)来列出Linux上的共享库依赖项?而不是使用ldd... 最佳答案 readelf-Walib.so|grepNEEDED 关于linux-linux上列出共享库依赖的编程方式,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6660745/
这是一个“可执行”共享库的最小示例(假定文件名:mini.c)://Interpreterpathisdifferentonsomesystems//+definitelydifferentfor32-Bitmachinesconstcharmy_interp[]__attribute__((section(".interp")))="/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2";#include#includeintentry(){printf("WooFoo!\n");exit(0);}如果用例如gcc-fPIC-omini.so-shar
这是一个“可执行”共享库的最小示例(假定文件名:mini.c)://Interpreterpathisdifferentonsomesystems//+definitelydifferentfor32-Bitmachinesconstcharmy_interp[]__attribute__((section(".interp")))="/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2";#include#includeintentry(){printf("WooFoo!\n");exit(0);}如果用例如gcc-fPIC-omini.so-shar
我想创建一个使用来自第3方静态库的函数的共享库。例如,libfoobar.a中的foo和bar。我知道我的主应用程序也在使用foo并将导出该符号。所以我只是想在bar中链接以节省代码大小并保留“foo”未解析(因为它将由主应用程序提供)。如果我包含libfoobar.a,链接器ld将在我的共享库中包含这两个函数。如果我不包含libfoobar.a,我的库将无法访问函数bar,因为应用程序本身没有链接到bar。问题:有没有办法告诉ld在构建共享库时只解析某些符号?将libfoobar.a变成共享库?从libfoobar.a中提取包含函数bar的文件并在链接器行上指定?别担心,运行时加载程