Articles of ld

为什么LD_PRELOAD似乎不能用wc写入

我正在玩LD_PRELOAD拦截libc调用,似乎写入调用不被拦截与wc,虽然它似乎与猫一起工作。 下面显示了一个精简版的问题。 RedHat Linux 2.6.9-42.ELsmp Makefile文件 writelib: gcc -Wall -rdynamic -fPIC -c write.c gcc -shared -Wl,-soname,libwrite.so -Wl,-export-dynamic -o libwrite.so write.o -ldl 为write.c: #include <stdio.h> #include <string.h> #ifndef __USE_GNU #define __USE_GNU #define __USE_GNU_DEFINED #endif #include <dlfcn.h> #ifdef __USE_GNU_DEFINED #undef __USE_GNU #undef __USE_GNU_DEFINED #endif #include <unistd.h> #include <stdlib.h> static ssize_t (*libc_write)(int fd, const void *buf, size_t len); […]

NVCC CUDA交叉编译无法find“-lcudart”

我已经在Ubuntu虚拟机上安装了CUDA 5.0和NVCC,甚至在编译CUDA C程序时也遇到了问题。 错误如下: user@ubuntu:~/CUDA$ nvcc helloworld.cu -o helloworld.o -target-cpu-arch=ARM -ccbin=/usr/bin/arm-linux-gnueabi-gcc-4.6 –machine=32 /usr/lib/gcc/arm-linux-gnueabi/4.6/../../../../arm-linux-gnueabi/bin/ld: skipping incompatible /usr/local/cuda-5.0/bin/../lib/libcudart.so when searching for -lcudart /usr/lib/gcc/arm-linux-gnueabi/4.6/../../../../arm-linux-gnueabi/bin/ld: skipping incompatible /usr/lib/libcudart.so when searching for -lcudart /usr/lib/gcc/arm-linux-gnueabi/4.6/../../../../arm-linux-gnueabi/bin/ld: cannot find -lcudart collect2: ld returned 1 exit status 我试图研究这个问题,并遇到这个链接: 跳过不兼容的libcudart.so当search-lcudart 所以我遵循了在该链接上提供的build议,并添加了 /usr/local/cuda-5.0/lib64 和 /usr/local/cuda-5.0/lib 到我的LD_LIBRARY_PATH环境variables,现在这是结果 user@ubuntu:~/CUDA$ echo $LD_LIBRARY_PATH /usr/local/cuda-5.0/lib:/usr/local/cuda-5.0/lib64 user@ubuntu:~/CUDA$ 但问题依然存在,请大家帮忙。

_dl_runtime_resolve – 何时将共享对象加载到内存中?

我们有一个高性能需求的消息处理系统。 最近我们已经注意到,第一条消息比后面的消息要长很多倍。 一系列转换和消息增强是在我们的系统中进行的,其中大部分是通过外部库来完成的。 我刚刚分析了这个问题(使用callgrind),比较一个消息的“运行”和许多消息的“运行”(提供比较基准)。 我看到的主要区别是占用了大量时间的函数“do_lookup_x”。 看看这个函数的各种调用,它们似乎都被通用函数调用:_dl_runtime_resolve。 不知道这个函数做了什么,但对我来说,这看起来像第一次使用各种共享库,然后由ld加载到内存中。 这是一个正确的假设吗? 二进制文件不会将共享库加载到内存中,直到它们被准备好使用,因此我们将看到第一条消息的大量减速,但是在后面的任何一条消息中都没有? 我们如何去避免这个? 注意:我们在微秒级别上运行。

链接无法find符号,但库被读取并且符号存在

我一直在试图编译我的项目,我得到undefined reference错误。 例如。: installertest.cpp:(.text+0x9d1): undefined reference to `XmlRpcValue::makeArray()' … installertest.cpp:(.text+0xede): undefined reference to `dbcancel' installertest.cpp:(.text+0xefd): undefined reference to `dbfcmd' installertest.cpp:(.text+0xf0f): undefined reference to `dbsqlexec' installertest.cpp:(.text+0xf2d): undefined reference to `SHA1_Init' … 我的命令是: g++ -o installertest \ -lsybdb \ -lxmlrpc \ -lxmlrpc_cpp \ -lxmlrpc_xmlparse \ -lxmlrpc_xmltok \ -lxmlrpc_util \ -lxmlrpc++ \ -lxmlrpc_server_cgi \ -lssl \ -std=c++0x \ […]

gcc – / usr / bin / ld错误:无法在/ usr / local / lib中find<library>,但ldconfig列出它,path添加到ld.so.conf

我尝试编译一个C ++代码,使用我也手动编译并安装在/ usr / local / lib中的库 在链接步骤中,软件的编译失败: /usr/bin/ld: error: cannot find -lcppdb g ++似乎不会在/usr/local/lib默认search,对于clang++ g++ -print-search-dirs # does not show /usr/local/lib 然而事实是/usr/local/lib在我的/etc/ld.so.conf而且我以root身份运行了ldconfig ,并且实际运行了ldconfig -p | grep cppdb ldconfig -p | grep cppdb显示我 libcppdb_sqlite3.so.0 (libc6) => /usr/local/lib/libcppdb_sqlite3.so.0 libcppdb_sqlite3.so (libc6) => /usr/local/lib/libcppdb_sqlite3.so libcppdb.so.0 (libc6) => /usr/local/lib/libcppdb.so.0 libcppdb.so (libc6) => /usr/local/lib/libcppdb.so 添加-L/usr/local/lib选项当然解决了这个问题,但是目标是使用configuration文件

i386input文件的体系结构与i386:x86-64不兼容

我正在尝试使用Ubuntu创build一个简单的内核。 在我input的terminal中 ld -Ttext 0x1000 -o kernel.bin loader.o main.o Video.o 但是我得到了以下错误信息: ld: i386 architecture of input file `loader.o' is incompatible with i386:x86-64 output ld: warning: cannot find entry symbol _start; defaulting to 0000000000001000

未find版本GLIBCXX_3.4.11(buildW.mexglx需要)

我正在尝试通过matlab 在这里编译一个c ++ ubuntu项目。 当我试图用make命令编译后使用它时,出现以下错误: Invalid MEX-file '////fashionista_v0.2/lib/+bsr/buildW.mexglx': //local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ////fashionista_v0.2/lib/+bsr/buildW.mexglx) 我对这些stream程并不熟悉,所以我不能理解这样的几个提议的解决scheme。 什么是libstdc ++和GLIBCXX,我该如何解决这个问题? 我正在尝试使用从nkjtbuild议的链接来解决问题: export LD_LIBRARY_PATH=${prefix}/lib:$LD_LIBRARY_PATH 但是,由于缺乏unix的shell知识,我不明白要在命令中放什么。 我有定位libstdc ++ .a和.so文件在gcc文件夹/usr/lib/gcc/i686-linux-gnu/4.6 ,我正在尝试以下操作: export LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.6:$LD_LIBRARY_PATH 但是,我的matlab错误仍然存​​在。 我正在使用Ubuntu 12.04版本的gcc 4.6和matlab r2011a。 编辑:我已经更新了matlab版本到r2012a的问题仍然是一样的。 我也尝试了以下内容: sudo ln -s /usr/lib/cc/i686-linux-gnu/4.6/libstdc++.so libstdc++.so.6 我无法创build文件已经存在的文件。 usr / lib / libstdc ++。so.6 |的输出 grep GLIBC: GLIBCXX_3.4 GLIBCXX_3.4.1 … GLIBCXX_3.4.10 […]

Linux,GNU GCC,ld,版本脚本和ELF二进制格式 – 它是如何工作的?

我正试图在Linux中学习更多关于图书馆版本pipe理的知识,以及如何把这一切付诸实施。 这是上下文: – 我有两个版本的dynamic库,它们公开了相同的一组接口,比如libsome1.so和libsome2.so 。 – 应用程序链接到libsome1.so 。 – 这个应用程序使用libdl.sodynamic加载另一个模块,比如说libmagic.so 。 – 现在libmagic.so链接到libsome2.so 。 显然,如果不使用链接器脚本来隐藏libmagic.so符号,则在运行时所有对libsome2.so中的接口的调用libsome2.soparsing为libsome1.so 。 这可以通过检查libVersion()返回的值与macrosLIB_VERSION的值来LIB_VERSION 。 – 所以我尝试下一步编译链接libmagic.so链接器脚本,隐藏libmagic.so中定义的除3之外的所有符号,并由其导出。 这工作…或者至lesslibVersion()和LIB_VERSION值匹配(并报告版本2不是1)。 但是,当一些数据结构被序列化到磁盘时,我注意到一些腐败。 在应用程序的目录中,如果我删除了libsome1.so并在它的位置创build一个指向libsome1.so的软链接,一切都按预期工作,并且不会发生同样的损坏。 我不禁想到,这可能是由于运行时链接程序的符号parsing中的一些冲突造成的。 我已经尝试了很多东西,比如试图链接libsome2.so这样所有的符号都被symbol@@VER_2为symbol@@VER_2 (我仍然感到困惑,因为命令nm -CD libsome2.so仍然将符号列为symbol而不是symbol@@VER_2 )…似乎没有工作! 帮帮我!!!!!! 编辑:我应该早些提到它,但有问题的应用程序是Firefox,而libsome1.so是libsqlite3.so随附的。 我不太可能重新编译它们。 而且,使用版本脚本来隐藏符号似乎是目前唯一的解决scheme。 那么当符号被隐藏时究竟发生了什么? 他们成为“本地”的SO? rtld不知道他们的存在吗? 当一个导出的函数引用一个隐藏的符号时会发生什么?

当存在同名的共享库时,如何强制与静态库链接

假设我有一个main.cpp文件,它使用了在libmath定义的sin()函数。 另外假设我们在同一个目录中都有libmath.a和libmath.so。 现在如果我发出命令g++ -o main main.cpp -lmath ,Linux的默认行为是链接到共享库libmath.so 。 我想知道是否有办法强制程序链接静态库libmath.a而不删除或移动共享库?

创build一个静态的Haskell Linux可执行文件

我常常不喜欢两件事情,一起引起我很多烦恼(除了我的孩子)。 我在工作中使用了一个Haskell程序,它使用像text,xml-enumerator,attoparsec-text等库。我可以正常工作在我的Windows机器上,我的Ubuntu虚拟机在工作(32位),我的Ubuntu桌面(再次32位)和运行Ubuntu(64位)的EC2实例。 我们的客户正在运行CentOS 5.3,64位。 我不能为我的生活得到这个可执行文件正常运行。 我试图创build一个静态的可执行文件, ghc –make myprog.hs -optl-static -optl-pthread 但是当我尝试在CentOS服务器上运行该可执行文件时,我收到一条错误消息: openFile: invalid argument (Invalid argument) 我假设这与这里描述的错误有关。 我试过编译32位和64位Ubuntu,尝试静态和共享的构build,没有任何工作(虽然我偶尔会得到segfaults而不是上述错误信息)。 我可以尝试下载CentOS 5.3并为它创build一个虚拟机,但下载需要一段时间,我不确定哪个版本的GHC可以工作(我尝试在服务器上获得GHC 7,但是我跑了到一个libc的问题)。 在这一点上,我提出了一些可能的方法,但是我想尽可能地避免这些方法: 用不同的语言重写(在Java中这样做的想法使我感到不安,虽然它可能是尝试Cal / OpenQuark的好时机)。 也许尝试一个替代编译器,如jhc。 但是我不太确定如何开始在jhc中安装这个程序的所有依赖项。 如果有经验,并且知道文本/ attoparsec / etc在jhc中工作,我很乐意听到。 所有黑客攻击:build立一个Windows可执行文件,在他们的服务器上安装wine并以这种方式运行。 总而言之,在这些情况下,我真的希望我们有一个用于GHC的JVM后端。 我想我也可以试用LambdaVM。 但我很想听听社区的build议,在这里做什么。