我正在阅读一套Linux共享库jemalloc的指令,这个指令将在运行时被预加载,因为它重载了像malloc这样的函数。 一种使库被预加载的方法是在系统variablesLD_PRELOADinput一个入口,例如,在程序启动之前装入程序,然后再执行其他可能具有相同名称function的共享库。 另一种方法是在文件/etc/ld.so.preloadinput一个条目。 后一种方法将使其成为所有用户的默认值,而不仅仅是一个实例。 但后者的说明书的作者说,只知道在Debian Linux上工作。 我一直在寻找明确回答的文档: /etc/ld.so.preload是否在所有Linux版本中使用; 所有的Unix口味; 或只是某些?
假设dynamic库与可执行的精灵不同,只有一点:没有入口点可以开始执行。 就我个人而言,我能够用简单的代码创build一个可执行共享库 – 我刚刚设置了一个入口点。 所以,和调用ld-linux.so几乎一样。 现在请不要把西红柿扔给我,但是如果我在这里,为什么我们不能把两个可执行文件链接在一起 – 如果可执行文件和共享目标文件都具有相同的文件格式并且差别很小? 为什么我们甚至有可执行文件,但不仅仅是共享对象文件? 接下来的问题是为什么我们不能简单地提供可执行库而不是可执行文件? 请尽可能地解释。
我试图设置Lighttpd + lua + fastcgi在embedded式MIPS板上运行Web界面。 但是这里的重要部分,我猜是Lua。 当试图运行/usr/local/bin/wsapi.fcgi(这是lua脚本),我得到这个错误: /usr/bin/lua: error loading module 'lfcgi' from file '/usr/local/lib/lua/5.1/lfcgi.so': File not found stack traceback: [C]: ? [C]: in function 'require' /usr/local/share/lua/5.1/wsapi/fastcgi.lua:9: in main chunk [C]: in function 'require' /usr/local/bin/wsapi.fcgi:9: in main chunk [C]: ? 这真的很奇怪,因为ls显示文件在那里,所有权限都可以: # ls -l /usr/local/lib/lua/5.1/lfcgi.so -rwxr-xr-x 1 0 0 21152 /usr/local/lib/lua/5.1/lfcgi.so 而更令人沮丧的是,如果我真的删除了文件,lua显示了一个不同的错误,这意味着第一个错误并不是由lua无法正确定位文件造成的。 所以我在这里有点迷路,看起来像错误信息是误导和问题不是真的没有find的文件,但是什么… PS错误来自文件wsapi / […]
我正在重写Linux项目上的C ++全局新/删除操作符。 这一切在我自己的代码中很好地工作,直到我发现系统库中的新/删除符号也被replace为我的代码! 这是一个非常糟糕的问题,因为它远远超出了我预期的“恶劣程度”。 所以问题是如何防止链接器/编译器从其他(系统)共享库中取代新/删除syms? 或者更确切地说,我如何控制共享库从我的库中链接syms? 我希望系统库仍然会使用默认的新build/删除实现。 尤其是当可执行文件稍后将其他可选dynamic库加载到不受我控制的dlopen()时。 自定义全局新build/删除操作符实现被构build到共享库中。 我在互联网上search了如何控制dynamic链接,但没有成功。 我首先尝试更改testing可执行文件的库链接顺序,但是这并没有改变任何东西。
我刚刚发现,glibc 2.23有一个关于stdio函数fmemopen()的bug,请参阅例如在使用fmemopen打开的FILE *上使用rewind() 。 (这里描述的bug的行为并不是唯一的问题,如果缓冲区的大小超过8192字节,问题会变得更加严重) 现在我正在考虑使用刚刚发布的glibc 2.24,它修复了这个bug。 但是,我的目标用户环境是Ubuntu计算机,我认为在Ubuntu支持glibc 2.24之前还需要一些时间。 那么,当我尝试分发我的代码时,我会遇到什么问题? 或者,一些相关的问题: 我什么时候可以期待Ubuntu将支持glibc 2.24? 系统中可能有两个libc版本吗? 有没有可能静态链接libc? 事实上,我只需要stdio部分。 是否有可能只使用2.24的stdio,这会给予任何好处吗?
我在Linux中查看共享库的'nm'命令的输出。 我看到这个 U stderr@@GLIBC_2.0 这是否意味着stderr是硬链接glibc2.0? 我问这个问题的原因是,我们有一套库(比如说a1.so,a2.so,…),它们是针对我们导出库的不同版本之一构build的(比如说ex.so.1, ex.so.2)。 导出的库都会导出一个函数,比如说foo。 当加载a * .so库时,它们会以某种方式神奇地将相应的函数修补到它们所针对的库中。 我看到nm的输出,像下面的不同库。 nm a1.so | grep foo U foo@@ex.1 nm a2.so | grep foo U foo@@ex.2 “@@”在这里扮演什么angular色? 我找不到任何关于“@@”的文档。 任何参考将是有帮助的。
我试图改变一个共享库中的特定string,并运行与之链接的程序后,我得到这个错误: ./prog: symbol lookup error: /home/user/lib/libprog.so: undefined symbol: have_qwerty, version PROG_PRIVATE 改变string的命令是: sed -i "s/have_somewq/have_qwerty/g" ./libprog.so 理论上,这应该工作不pipe,因为这个string在使用这个库的所有文件和整个库中都被改变了。 那么这里有什么问题呢? 我该如何解决或debugging这个问题?
我正在使用提供的Makefile在我的Ubuntu 64位系统上构build一个C ++项目,该项目还为开发人员提供了一个API库。 编译成功了,没有任何错误,但是当我尝试在我的文件中包含“api”文件夹中提供的API库时, g++抱怨未定义的引用 。 这不是关于依赖的问题(我已经成功地构build了项目),实际上缺less的引用是关于项目提供的类和函数的,但是它们在一些特定的(子)文件夹中(我不知道哪个!),我猜在一些.so文件中 , g++没有find它们,可能是因为它不知道它们在那些特定的子文件夹中。 尝试使用任何项目中的 API时,这不是第一次发生这种情况,那么我认为我错过了某些东西,或者在尝试使用项目中提供的库时总会出现错误。 特别是,主要的问题是我不知道如何告诉编译器在哪里声明了一些类或数据结构 ,而且我不知道如何定位它们以便知道它们在哪里。 通常情况下,我用来避免这个问题的解决方法是运行make install (以root用户或使用sudo ),以便库和API安装在标准文件夹(如/usr/include或/usr/lib )中,如果我这样做我可以使用#include <library>包含API库,但在最后一种情况下,它也不能工作,因为可能包含未find的类/结构的某些必需文件未正确安装在系统的正确文件夹中。 我有时使用的另一个解决方法是尝试将所有项目文件放在同一个文件夹中,而不是使用项目文件夹结构,但显然这并不好! 🙂 但我注意到其他几个人设法使用这些API ,显然他们知道find包含“未定义”引用的文件,并将它们包含在编译中。 然后,我的一般问题是:如果我想使用项目提供的库编写C ++文件,给定一个基于“Makefile”文件的“经典”C ++项目和常用文件夹名称,如src , lib , build , bin等,但编译器抱怨未定义的引用, 如何find包含这些引用的文件(.so或.o或.cpp)? 有没有find它们的工具? 我怎么能告诉编译器他们在哪里? 我应该使用g++命令行选项,还是应该以某种智能的方式使用#includemacros? PS我也尝试使用pkc-config linux工具来获得正确的选项来编译,它们是可用的,但编译器仍然抱怨未定义的引用。 关于我尝试的项目更多的消极影响: 对于感兴趣的人来说,这个项目的链接如下: https : //github.com/dreal/dreal3 并指示如何build立它: http : //dreal.github.io/download/
我已经在Linux中实现了一个共享库,并尝试对其进行testing,但是我得到一个错误“未定义的引用CEDD(char *)'”。 我使用以下参数的Eclipse: 包含文件的path(这里是一切正常) 图书馆及其名称的path。 path是正确的,名称是WISE_C(全名:libWISE_C.so) 我的代码: 我用于testing的testing程序: #include <iostream> #include <Descriptor.h> int main() { char* path = "/export/home/pdmazubi3/workspace/proj1/src/pic.jpg"; double * cedd = CEDD(path); ///// <-ERROR! std::cout << "!!!Hello World!!!" << cedd[1]; return 0; } 标题描述符.h: double* CEDD(char* path); Descriptor.c的一部分,具有理想的function: #include "Descriptor.h" #include "highgui.h" #include "cv.h" double* CEDD(char* path) { IplImage* srcImg; IplImage* ImageGrid; … […]
如何列出链接到libssl的Red Hat Linux系统上的所有可执行文件? 我可以接近: find / -type f -perm /a+x -exec ldd {} \; | grep libssl ldd向我展示了可执行文件链接的库,但是包含库名称的行并不显示文件名,所以虽然我和grep有很多匹配,但我不知道如何退出从中发生匹配的可执行文件。 任何帮助将不胜感激。