ld相关内容
makefile 中 -I 和 -L 标志的用途是什么? 解决方案 这些通常是链接器命令行的一部分,或者直接在目标操作中提供,或者更常见地分配给 make 将被扩展以形成链接命令的变量.在这种情况下: -L 是包含库的目录的路径.库的搜索路径. -l 是您要链接的库的名称. 例如,如果您想链接到库 ~/libs/libabc.a,您需要添加: -L$(HOME)/lib
..
由于版本差异,我想与我的程序一起提供共享库,而不是使用目标系统的. ldd 说我的程序使用了这些共享库: linux-gate.so.1 =>(0xf7ef0000)**(内核制作)**libc.so.6 =>/lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)**/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)*
..
GNU ld(链接器脚本)手册部分 3.5.5 源代码参考 提供了一些关于如何访问链接描述文件“变量"的非常重要的信息.(实际上只是整数地址)在 C 源代码中.我用了这个信息.广泛使用链接器脚本变量,我在这里写了这个答案:如何从 C 中获取 ld 链接描述文件中定义的变量的值. 但是,很容易做错并尝试访问链接描述文件变量的值(错误地)而不是其地址,因为这有点深奥.手册(上面的链接)说:
..
LD 手册没有解释什么KEEP 命令确实如此.下面是来自第三方链接器脚本的片段,其中包含 KEEP.ld中的KEEP命令有什么作用? 部分{.文本 :{.=对齐(4);_text = .;提供(stext = .);保持(*(.isr_vector))保持(*(.init))*(.text .text.*)*(.rodata .rodata.*)*(.gnu.linkonce.t.*)*(.gl
..
我正在尝试在 Linux 下编译 C 程序.但是,出于好奇,我尝试手动执行一些步骤:我使用: 生成汇编代码的 gcc 前端 然后运行 GNU 汇编程序以获取目标文件 然后将其与 C 运行时链接以获得工作可执行文件. 现在我被链接部分卡住了. 程序是一个非常基础的“Hello world": #include int main() {printf("你好
..
对于大学课程,我喜欢比较使用 gcc/clang 和汇编编写和编译的功能相似程序的代码大小.在重新评估如何进一步缩小某些可执行文件的大小的过程中,当我两年前组装/链接的相同汇编代码现在在再次构建后增长超过 10 倍时,我无法相信自己的眼睛(这适用于多个程序,不仅是 helloworld): $ 制作as -32 -o helloworld-asm-2020.o helloworld-asm-20
..
有一个远程 64 位 *nix 服务器可以编译用户提供的代码(应该用 Rust 编写,但我认为这并不重要,因为它使用 LLVM).我不知道它使用哪个编译器/链接器标志,但编译后的 ELF 可执行文件看起来很奇怪——它有 4 个 LOAD 段: $ readelf -e 可执行文件...程序标题:类型 偏移 VirtAddr PhysAddrFileSiz MemSiz 标志对齐...加载 0x0
..
我有一个可用的链接器脚本.我想添加另一个数据部分,其内容是直接从文件中提取的(ld 不应该解析它并提取这些部分等等).我该怎么做? OUTPUT_FORMAT("elf32-i386")进入(开始)部分{.text 0x100000:{*(.multiboot)*(.文本)*(.代码)*(.rodata*)}.数据 : {*(.数据)}.bss:{*(.bss)}kernel_end = .;r
..
澄清一下,我的问题是指包装/拦截从一个函数/符号到另一个函数/符号的调用当调用者和被调用者使用 GCC 编译器和链接器在同一个编译单元中定义时. 我的情况类似于以下: /* foo.c */无效富(无效){/* ... 一些东西 */酒吧();}空栏(空){/* ... 一些其他的东西 */} 我想包装对这些函数的调用,我可以(在一定程度上)使用 ld 的 --wrap 选项 (然后我实
..
我正在 Linux x86_64 上试验 ELF 可执行文件和 gnu 工具链: 我已经链接并(手动)剥离了一个“Hello World"测试: .global _start.文本_开始:移动 $1, %rax... 转换为 267 字节的 ELF64 可执行文件... 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF…………
..
我有一个安装在 /PATH/lib 中的动态库 libtest.dylib,以及一个执行二进制文件 myapp,它使用安装在 /PATH/bin. 我可以运行 myapp 来查找 dylib,如下所示 (可以在 Mac OS X 上使用 DYLD_LIBRARY_PATH 吗?还有,它的动态库搜索算法是什么?): DYLD_LIBRARY_PATH="/PATH/lib" myapp 我
..
我刚刚使用 2013 年 4 月 15 日的命令行工具升级到 Xcode 5 beta,并在标准 CMakeTestCCompiler.cmake 尝试编译一个简单的测试程序期间运行 cmake 构建时遇到以下警告: cmake -versioncmake 版本 2.8.11.2ld:为 MacOSX 构建,但链接到为 iOS 模拟器文件构建的 dylib '/Applications/Xcod
..
我通过 CMAKE_C_FLAGS 在 CMake 中设置了 CFLAGS.像这样设置 LDFLAGS 吗? 解决方案 这取决于你想要什么: A) 如果要指定链接到哪些库,可以使用 find_library 找到库,然后使用 link_directories 和 target_link_libraries到. 当然,写一个好的find_package 脚本,它很好地添加了带有
..
我正在尝试编译/移植旧版本的 OpenOffice.它使用 Boost v1.34.1,它是源代码树的一部分.错误信息如下: 未定义符号:“boost::throw_exception(std::exception const&)",引用自:boost::detail::shared_count::shared_count(ScToken*) in detfunc.old:未找到符号 Boos
..
我已经通过 yum 在 Fedora 20 上安装了 boost 并且正在尝试一些简单的例子.但是,我无法编译 日志教程中的第一个示例. 使用 g++ -c boosttest.cc 编译工作正常,但是当我尝试将其链接到时出现很多错误 g++ boosttest.o -o boosttest -lboost_log -lpthread 完整的错误日志: boosttest.o:在函数‘
..
我正在尝试在 Linux 下编译 C 程序.但是,出于好奇,我正在尝试手动执行一些步骤:我使用: 生成汇编代码的 gcc 前端 然后运行 GNU 汇编程序以获取目标文件 然后将其与 C 运行时链接以获取可运行的可执行文件. 现在我被链接部分困住了. 该程序是一个非常基本的“Hello world": #include int main() {printf("你好\n")
..
我有一些代码使用了一些共享库(gcc 上的 c 代码).编译时,我必须使用 -I 和 -L 显式定义包含和库目录,因为它们不在标准位置.当我尝试运行代码时,出现以下错误: ./sync_test./sync_test:加载共享库时出错:libsync.so:无法打开共享对象文件:没有这样的文件或目录 但是,请执行以下操作,一切正常: export LD_LIBRARY_PATH="/path
..
在 x86_64 linux 上使用 gcc 和 ld 我需要链接到新版本的库 (glibc 2.14),但可执行文件需要在旧版本 (2.5) 的系统上运行.由于唯一不兼容的符号是 memcpy(需要 memcpy@GLIBC_2.2.5 但提供 memcpy@GLIBC_2.14 的库),我想告诉链接器,而不是采用 memcpy 的默认版本,它应该采用我指定的旧版本. 我发现了一种非常奇怪
..
为什么我在使用 gcc 时会收到“未定义的引用"错误? 我正在尝试创建一个导出一个函数“external()"的共享对象 (.so).然后我尝试链接到 .so 但得到“未定义的引用‘外部’".我在这里做错了什么? 文件:external.c int external() {返回 5;} 文件:program.c int external();int main(char** arg
..
我有一个程序和一个静态库: //main.cppint main() {}//mylib.cpp#include 结构体{S() { std::cout
..