Articles of dynamic

编译Lua – 创build.so文件?

我在Centos 6.5上编译Lua 5.2.3,编译/安装正常。 但是,我还需要开发库来编译另一个程序。 我通常会这样做安装这些: yum install lua-devel 问题是,安装Lua 5.1共享库,而不是5.2.3的。 我可以从Centos的回购库中运行Lua 5.1,但如果这是一个简单的事情(知道的人)来做最新的版本,那么我会很感激有人给我指路。 对我来说,Linux makefiles仍然有点呃,你知道… 编辑 我很久以前发现这个网站 – http://lua-users.org/lists/lua-l/2006-10/msg00091.html – 它提出了对makefile的一些改变,但是当我运行它的时候我得到了这个现在: gcc -fPIC -o liblua.so -shared lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o lmathlib.o loslib.o lstrlib.o ltablib.o […]

如何从使用:: dlopen打开的库中获取dynamic加载库的名称?

在Windows中可以使用GetModuleFileName。 那么Linux呢?

在程序启动时测量dynamic链接所花的时间?

我如何测量在程序启动时dynamic链接的时间? 想到的解决scheme,为什么我犹豫不决: 1)在运行程序之前和主程序开始之前打印一些时间。 这并没有考虑可能的代码,这些代码在全局variables的主要初始化和任何结果函数调用之前运行。 它不是自动出来的,它让我觉得很粗鲁,而且很可疑。 2)一个空程序的时间命令,它与被测程序具有相同的标题,并dynamic链接到相同的库。 我不确定这个。 我不知道编译器和链接器是否可以合谋缩短基于客户端代码内容的dynamic链接,但似乎是可能的。 编辑:问了6分钟后,我仔细检查了谷歌显而易见的search条件,“度量dynamic链接时间”,最终成为第一个search结果。

Python的ctypes不加载在Mac OS X的dynamic库

我有一个C ++库repeater.so ,我可以在Linux中从Python加载以下方式: import numpy as np repeater = np.ctypeslib.load_library('librepeater.so', '.') 但是,当我在Mac OS X(Snow Leopard,32位)上编译相同的库并获得repeater.dylib ,然后在Python中运行以下代码: import numpy as np repeater = np.ctypeslib.load_library('librepeater.dylib', '.') 我得到以下错误: OSError: dlopen(/mydir/librepeater.dylib, 6): no suitable image found. Did find: /mydir/librepeater.dylib: mach-o, but wrong architecture 在Mac OS X上,我是否需要做一些不同的工作才能在Python中加载dynamic库?

在Linux上创build.SO文件而不使用PIC(位置独立代码)(x86 32位)

据我所知,x86汇编代码受寄存器数量有限的限制。 当我在Linux上得知,为了创build一个.so文件,我们必须为gcc指定-fPIC命令行参数来创build与位置无关的代码,我不能相信它。 据我所知,elf文件格式支持重定位,就像在我眼中好得多 – Windows DLL系统工作:在Windows上,链接器重新定位DLL中的所有偏移(如果需要的话)。 我认为加载SO文件或DLL文件所需的时间,以及用于保存不同的.so文件的内存量并没有像指向整个寄存器的时间一样糟糕GOT和所有这些间接跳跃。 我也不在乎ALSR等等,因为我只是关心在库中的代码尽可能优化。 1)为什么Linux不支持更多的dynamic库加载,如Windows应该产生更多的性能代码? 到目前为止,我没有find真正的解释。 只是有些事情,如果重定位代码会非常糟糕,速度太慢(当然,在桌面计算机上加载文字处理器,加载速度有多快,我完全接受,但是对于计算密集型服务器进程不处理来自互联网的恶意数据),我想拥有所有的性能和注册我可以得到! 2)是否可以在Linux上创build非-fPIC编译的SO文件? 我可以离开-fPIC吗? 有没有什么howto,手册或项目在这个主题上工作,并可以不浪费整个注册,并仍然dynamic加载库? 如果我在编译.so文件时只放下-fPIC会怎么样?

linux交叉编译和dynamic库/链接

我正在努力为BeagleBoard开发。 因此我安装了CodeSourcery Sourcery_G ++ _ Lite工具链。 我想使用opencv库。 所以我把源代码下载到我的Ubuntu devolepment系统中,用gcc作为共享库编译并安装了这个库。 当我为x86架构构build一个helloworld应用程序时,一切都很好。 现在,我想用ARM架构的其他工具链编译相同的应用程序。 编译/链接时,我得到这些警告/错误: john@ubuntu:~/Downloads/BeagleTest$ arm-none-linux-gnueabi-g++ -c ImageProcessing.cpp -o ImageProcessing.o -I/usr/local/include cc1plus: warning: include location "/usr/local/include" is unsafe for cross-compilation john@ubuntu:~/Downloads/BeagleTest$ arm-none-linux-gnueabi-g++ -c Main.cpp -o Main.o -I/usr/local/include cc1plus: warning: include location "/usr/local/include" is unsafe for cross-compilation john@ubuntu:~/Downloads/BeagleTest$ arm-none-linux-gnueabi-g++ -oApplication -L/usr/local/lib Main.o ImageProcessing.o -lopencv_core /usr/local/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/bin/ld: warning: library search […]

将代码/符号修补为dynamic链接的ELF二进制文件

假设我有一个dynamic链接的ELF二进制文件,我想覆盖/redirect某些库调用。 我知道我可以用LD_PRELOAD来做到这一点,但是我想要一个在二进制文件中永久存在的独立于环境的解决scheme,它可以用于setuid / setgid二进制文件,其中没有一个是LD_PRELOAD可以实现的。 我想要做的就是从其他目标文件中添加代码(如有必要,可能在新的部分添加代码),并将这些目标文件中的符号添加到二进制文件的符号表中,这样就可以使用新添加的代码版本代替共享库代码。 我相信这应该是可能的,而不需要在现有的代码中进行实际的迁移。 即使它们在同一个文件中,它们应该能够在运行时以通常的PLT方式来parsing(因为我只关心函数,而不关心数据)。 请不要给我答复,“你不想这样做!” 或者“那不是便携的!” 我正在处理的是一种连接二进制文件与ABI不兼容的备用共享库实现的方式。 有问题的平台是i386-linux(即32位)。 除非我误解了什么是可能的,否则我可以编写一些工具来parsingELF文件并执行我的黑客攻击,但我怀疑有一种奇怪的方式来使用GNU链接器和其他工具来完成此操作,而无需编写新代码。

dlopen vs连接开销

假设我有一个库–foo.so。 在构build我的二进制文件(需要这个库)时,我可以(1)链接foo.so,或者(2)在程序源代码中,dlopen这个库,然后调用这个库提供的函数 当我从库中调用函数时,(1)和(2)之间是否有任何性能差异? 请注意,我知道会有不同的初始化特性(如dlopen的开销,第一次使用符号的开销等),但是在稳定状态下,两种select都同样快,还是更快? 谢谢。

在dynamic加载共享库时获取未定义的符号错误

dynamic加载库时遇到undefined symbol错误。 这是我的代码片断,产生这个错误: int main () { void *lib_handle = NULL; MyClass* (*create)(); void (*destroy)(MyClass*); char *error; lib_handle = dlopen ("./libshared.so", RTLD_LAZY); if (lib_handle == NULL) { fprintf(stderr, "%s\n", dlerror()); exit(1); } create = (MyClass* (*)()) dlsym(lib_handle, "create_object"); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(1); } destroy = (void (*)(MyClass*)) dlsym(lib_handle, […]

Linux不能finddynamic链接的应用程序

我有一个运行Linux Kernel 3.10和Busybox的embedded式系统。 如果我交叉编译(通过buildroot构build工具链,所以它使用uclibc)一个没有-static标志的程序。 它不会运行。 -/bin/sh: helloworld: not found 如果我用-static标志编译我的代码。 它通常会运行并输出HelloWorld 这里发生了什么?