想从 LLVM尝试这个lld。可以在此处找到有关 apt 的文档,但我不知道哪个包包含lld可执行文件。
似乎目的lld是删除系统依赖项,但 clang 没有lld内置。(还没有?)
使用以下示例测试是否lld使用。GNU-ld对存档文件出现的顺序lld施加了一些限制,但似乎对此更宽容(如果我理解正确的话),因此如果lld使用此示例,则应该可以成功构建。但是,它在我的盒子上失败了。
# one.c
extern int two();
int main(int argc, char *argv[])
{
two();
return 0;
}
# two.c
void two(){}
$ clang -c two.c; ar cr two.a two.o ; clang -c one.c ; clang two.a one.o
one.o: In function `main':
one.c:(.text+0x19): undefined reference to `two'
clang: error: linker command failed with exit code 1 (use …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下 NASM 命令组装下面的程序集源文件:
nasm -f elf -o test.o test.asm
Run Code Online (Sandbox Code Playgroud)
这完成没有错误,然后我尝试链接一个可执行文件ld:
ld -m elf_i386 -e main -o test test.o -lc
Run Code Online (Sandbox Code Playgroud)
这似乎也成功了,然后我尝试运行可执行文件:
$ ./test
bash: ./test: No such file or directory
Run Code Online (Sandbox Code Playgroud)
不幸的是,它似乎不起作用。我尝试ldd在可执行文件上运行:
linux-gate.so.1 => (0xf777f000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7598000)
/usr/lib/libc.so.1 => /lib/ld-linux.so.2 (0xf7780000)
Run Code Online (Sandbox Code Playgroud)
我安装了该lsb-core软件包并验证它/lib/ld-linux.so.2存在。为什么我仍然无法运行可执行文件?
我试图在运行 64 位版本 Ubuntu 15.04 的机器上执行此操作。
源代码:
; This code has been generated by the 7Basic
; compiler <http://launchpad.net/7basic>
extern printf
extern scanf
extern read
extern strlen
extern strcat
extern …Run Code Online (Sandbox Code Playgroud) 我想删除链接器用于查找 .so 库以进行测试的一些路径。
我找到了一种添加库路径的方法:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library"
Run Code Online (Sandbox Code Playgroud)
是否有类似于LD_LIBRARY_PATH我可以用来删除库路径的变量,例如/usr/local/lib或/usr/lib不在LD_LIBRARY_PATH链接器中但由链接器拾取的路径?即如何忽略 /etc/ld.so.conf.d/ 中给出的路径?
这样做的原因是我正忙于创建一个程序,对于给定的可执行文件,它递归地查找库依赖项。我想看看是否可以通过查找所有依赖项,将这些依赖项复制到本地目录中,并制作本地运行的 bash 脚本来设置 LD_LIBRARY_PATH 然后运行可执行文件,从而使程序更具可移植性。我想测试在删除以前重要的库搜索路径后这个本地运行的可执行文件是否有效。
anisha@linux-y3pi:~/> google-earth
./googleearth-bin: error while loading shared libraries: libGL.so.1: cannot open shared object file: No such file or directory
anisha@linux-y3pi:~/> locate libGL
/opt/google/earth/free/libGLU.so.1
/usr/lib64/libGL.so
/usr/lib64/libGL.so.1
/usr/lib64/libGL.so.1.2
/usr/lib64/libGLU.so.1
/usr/lib64/libGLU.so.1.3.070802
anisha@linux-y3pi:~/> uname -a
Linux linux-y3pi 2.6.34-12-desktop #1 SMP PREEMPT 2010-06-29 02:39:08 +0200 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
在 OpenSUSE 上,尝试使用 Mesa-32bit 中的 zypper 来安装 32 位版本的库。
linux-y3pi:# zypper in Mesa-32bit
Retrieving repository 'google-chrome' metadata [\]
Failed to download /repodata/repomd.xml from http://dl.google.com/linux/chrome/rpm/stable/x86_64
Abort, retry, ignore? [a/r/i/?] (a): r
Retrieving repository 'google-chrome' metadata [|]
Failed …Run Code Online (Sandbox Code Playgroud) 我们正在使用基于 beaglebone black 的定制板,我想将一些测试结果从 SPL 写入 RAM 位置,然后读取该日志并将其发送tftpput到主机 PC。
到目前为止,我可以tftpput从 RAM 到主机 PC。但在更安全的方面,我想找到 SPL 和 U-Boot 都不使用的 RAM 位置。
为了找出答案,我需要有关 SPL 和 U-Boot 内存映射的建议。董事会的信息如下所示:
#bdinfo
arch_number = 0x00000E05
boot_params = 0x80000100
DRAM bank = 0x00000000
-> start = 0x80000000 ---> RAM Start address
-> size = 0x10000000 ---> 256 MB
eth0name = cpsw
ethaddr = 1c:ba:8c:9d:5f:f0
current eth = cpsw
ip_addr = 192.168.1.106
baudrate = 115200 bps
TLB addr = 0x8FFF0000 ---> AFA i understand its …Run Code Online (Sandbox Code Playgroud) 我尝试从源代码编译 VTK,但收到以下错误。我运行的是 Fedora 27,内核版本 4.14.11-300.fc27.x86_64
/usr/lib64/libSM.so: undefined reference to `uuid_generate@UUID_1.0'
/usr/lib64/libSM.so: undefined reference to `uuid_unparse_lower@UUID_1.0'
Run Code Online (Sandbox Code Playgroud)
ldd /usr/lib64/libSM.so节目
$ldd /usr/lib64/libSM.so
linux-vdso.so.1 (0x00007ffd4998b000)
libICE.so.6 => /lib64/libICE.so.6 (0x00007f3aa36ff000)
libuuid.so.1 => /lib64/libuuid.so.1 (0x00007f3aa34fa000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3aa3115000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3aa3b23000)
Run Code Online (Sandbox Code Playgroud)
进一步查看libuuid.so.1中的符号显示
$objdump -T /lib64/libuuid.so.1 | grep 'uuid_generate$'
0000000000002370 g DF .text 0000000000000087 UUID_1.0 uuid_generate
$objdump -T /lib64/libuuid.so.1 | grep 'uuid_unparse_lower'
0000000000002710 g DF .text 0000000000000002 UUID_1.0 uuid_unparse_lower
Run Code Online (Sandbox Code Playgroud)
的输出ldconfig是
$sudo ldconfig -p | grep libuuid
libuuid.so.1 (libc6,x86-64) => /lib64/libuuid.so.1
libuuid.so.1 (libc6) => /lib/libuuid.so.1 …Run Code Online (Sandbox Code Playgroud) 我的项目树看起来像这样:
src/
include/
Makefile
lib/
lib/3rdparylib/
Run Code Online (Sandbox Code Playgroud)
我没有编写代码3rdpartylib,但决定将其源代码嵌入到我的项目打包中。我通过执行以下步骤来编译软件:
$ cd lib/3rdpartylib/
$ make
$ ln -s 3rdpartylib.so.0 3rdpartylib.so
Run Code Online (Sandbox Code Playgroud)
然后我编译每个的我的源文件是这样的:
$ gcc -c src/file.c -I include -o file.o -l 3rdparylib -L lib/3rdpartylib -I lib/3rdpartylib/include
Run Code Online (Sandbox Code Playgroud)
然后我链接:
$ gcc file1.o file2.o -l3rdpartylib -L lib/3rdpartylib -o myapp
Run Code Online (Sandbox Code Playgroud)
当我在我的主机上时,它运行良好。今天我试图在另一台机器上启动它。它编译和链接没有任何问题。但是,当我尝试启动该应用程序时,我收到以下错误消息。
./myapp:加载共享库时出错:3rdpartylib.so.0:无法打开共享对象文件:没有这样的文件或目录
我尝试执行以下操作:
export LD_LIBRARY_PATH=/path/to/3rdpartylib.so
Run Code Online (Sandbox Code Playgroud)
它似乎工作。但我知道使用 LD_LIBRARY_PATH 是一种不好的做法。每次我想运行我的应用程序时都设置这个变量让我很困扰。
我错过了什么?为什么它在我的主机上工作(其中 LD_LIBRARY_PATH 没有设置为任何东西)而不是在另一台机器上?另一台机器是虚拟机有关系吗?
如果有任何帮助,我的主要机器是 Debian 机器,而我的“新”机器是 Sabayon(Gentoo),在 Virtualbox 中运行。
我正在尝试编译我的程序,该程序需要C++11功能和boost比目标机器上安装的更新版本。因此,我使用所有依赖项和 binutils 的树内构建编译并安装gcc 4.9到某个本地目录 ( /secured/local)。然后我下载boost 1.55并运行./boostrap.sh --prefix=/secured/local && ./b4 install安装boost。两种编译都运行良好,gcc -std=c++11也运行良好。
我的程序是使用 cmake 和FindXX.cmake查找文件的常用程序构建的。我正在像这样运行 cmake:
cmake ../source/ -DBOOST_ROOT=/secured/local -DCMAKE_EXE_LINKER_FLAGS='-Wl,-rpath,/secured/local/lib'
Run Code Online (Sandbox Code Playgroud)
它成功地找到了我的新 boost 安装和新版本的 gcc。编译和链接都可以完美地工作。但是,在执行我的程序时,我收到以下错误:
$ ./surface
./surface: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ./surface)
./surface: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./surface)
./surface: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./surface)
./surface: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./surface)
./surface: /usr/lib64/libstdc++.so.6: version …Run Code Online (Sandbox Code Playgroud) 我试图了解符号表如何与 ELF 中的 .data 部分相关。首先是一些我作为基础的假设。
符号是映射到实际二进制值(CPU 对其进行操作)的函数或变量的人类可读(或“写在源文件中”)表示。
这是一个例子
//simple.c
int var_global_init = 5;
int main(void)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
让我们构建它并检查二进制文件:
$ gcc simple.c -o simple
$ objdump -t simple | grep var_global_init
0000000000201010 g O .data 0000000000000004 var_global_init
Run Code Online (Sandbox Code Playgroud)
它列出了.dataELF 文件部分中的符号。ELF 文档的第 20 页
将该.data部分定义为:
这些部分保存有助于程序内存映像的初始化数据。
好吧,这样的搭配。那么我问自己Does this mean that the symbol table is
embedded in the .data section?。但这似乎被下面的例子反驳了:
$ readelf -s simple
Symbol table '.symtab' contains 66 entries:
....
50: 0000000000201010 4 …Run Code Online (Sandbox Code Playgroud) 从一个单独的问题和有关该主题的其他文章来看,在通过或提供的任何库之前,似乎总是会解析 定义的附加库路径ld.so.conf.d(即在名称冲突的情况下,例如覆盖系统库时)。/lib/usr/lib
是否可以通过ld.so.conf.d或某种其他机制创建一个可以解析库的系统范围路径,但以最低/最新的可能分辨率级别?例如,我希望/ParanoidAndroid/解析 中 的库,但我希望该路径成为搜索它们的最后一个位置(即优先考虑 中 中的库/lib以及/usr/lib存储在 中的库/ParanoidAndroid/),因此现在的查找顺序是: