知乎有趣的网站北京互联网公司开发的网站

张小明 2026/1/10 5:45:53
知乎有趣的网站,北京互联网公司开发的网站,网站建设需要的文案,wordpress responsive theme与ld.so #xff08;以 Alpine 为例#xff09;背景#xff1a;Alpine Linux 是一个基于 musl libc 和 busybox 构建的轻量级 Linux 发行版#xff0c;专注于安全性、资源效率和简洁性。它被广泛用于 Docker 容器、嵌入式系统和云计算环境。基本概念#xff1a;gcc 和 ld.…与ld.so 以 Alpine 为例背景Alpine Linux 是一个基于 musl libc 和 busybox 构建的轻量级 Linux 发行版专注于安全性、资源效率和简洁性。它被广泛用于 Docker 容器、嵌入式系统和云计算环境。基本概念gcc 和 ld.so 分别是什么ld.sodynamic linker/loader是程序运行时的动态链接器。gcc 在编译期决定程序如何被加载而 ld.so 在运行时执行加载。1. gccGNU Compiler Collection功能将 C/C 源代码编译成目标文件.o并调用链接器ld生成可执行文件。它本身不直接做动态链接但它会调用汇编器as调用链接器ld来自 binutils在链接时指定使用哪个 动态链接器dynamic linker示例当你运行 gcc main.c -o appgcc 实际上做了源码 .c↓预处理 (cpp) → #include, #define 展开↓编译 (cc1) → 生成汇编代码.s↓汇编 (as) → 生成目标文件.o↓链接 (ld) → 合并所有 .o 和库生成可执行文件2. ld.so / ld-musl-*动态链接器Dynamic Linker/Loader功能程序启动时由内核加载负责加载程序依赖的共享库如 libc.so, libpthread.so 等进行符号解析、重定位然后跳转到程序入口 _start 或 main⚠️ 注意ld.so 是 GNU glibc 中对动态链接器的称呼在 musl 中它叫 ld-musl-*但作用相同。一、动态链接编译期 vs 运行时gcc 默认进行动态链接阶段 参与者 职责编译/链接期 gcc ld链接器 将源码编译为可执行文件并在其中嵌入一个名为 .interp 的段用于指定运行时的动态链接器路径。运行期 内核 ld.so 内核加载程序读取 .interp 段然后加载并执行指定的动态链接器如 ld-musl-* 或 ld-linux-*。动态链接器负责加载所有依赖的共享库并启动程序。它们通过 动态链接 建立联系gcc hello.c -o hello预处理 编译gcc 把 hello.c 编译成目标文件 hello.o链接Linkinggcc 调用 ldGNU linker属于 binutils进行链接关键一步嵌入“解释器”路径INTERP segment链接器会在最终的 ELF 可执行文件中写入一个特殊的段.interp$ readelf -l hello | grep -A 2 INTERPINTERP 0x0000000000000318 0x0000000000000318 0x00000000000003180x000000000000001c 0x000000000000001c R 0x1[Requesting program interpreter: /lib/ld-musl-x86_64.so.1]内容是动态链接器的路径例如/lib/ld-musl-x86_64.so.1这个路径是在链接时由 gcc 使用的 specs 文件或 crt 对象文件决定的打印gcc spec gcc -dumpspecs运行时内核发现 .interp 后先加载 ld-musl再由它加载程序和 libcexecve(hello, ...)→ 内核读取 ELF 的 .interp: /lib/ld-musl-x86_64.so.1→ 先加载 ld-musl→ ld-musl 加载 libmusl.so即 libc 实现→ 解析符号完成重定位→ 跳转到 _start → main()✅ 所以gcc 编译时将 ld.so 的路径写入.interp 段告诉内核在运行时使用哪个动态链接器。二、静态链接无运行时依赖静态链接通过 -static 标志实现它将所有依赖库的代码直接复制到最终的可执行文件中。$ gcc --verbose -static hello.c -o hello#include ... search starts here:#include ... search starts here:/usr/includeEnd of search list....COLLECT_GCC_OPTIONS--verbose -static -mtunegeneric .../usr/lib/gcc/x86_64-linux-gnu/11/cc1 -quiet -imultiarch x86_64-linux-gnu ...as ... -o /tmp/ccXXXXXX.o.../usr/bin/ld --hash-stylegnu --build-id --eh-frame-hdr -m elf_x86_64 \-static [... lots of .a files...] \-o hello-static# 只是 ld 多了一个 -static 参数表示要静态链接# 链接器加载了 libc.a, libgcc.a, crt*.o 等静态对象意味着所有需要的库代码包括 libc 中的 printf, malloc 等都被直接复制进最终的二进制文件中不再依赖外部 .so 文件没有 .interp 段不需要动态链接器参与启动过程此时程序结构更简单用户执行 ./hello→ 内核直接加载整个程序映像包含所有代码→ 直接跳转到入口点 _start → main()你可以通过以下命令验证一个程序是否为静态链接# 输出类似 statically linked 的信息file ./hello# 如果输出 not a dynamic executable则是静态链接ldd ./hello# 如果没有输出则表示没有 .interp 段readelf -l ./hello | grep INTERP三、Alpine (musl) vs. 主流发行版 (glibc)Alpine 的 gcc 是为 musl C特别配置的这与 Ubuntu/CentOS 等使用 glibc 的系统有本质区别。项目 Alpine Linux (musl) Ubuntu/CentOS (glibc)C 标准库 musl libc glibc动态链接器 /lib/ld-musl-*.so.1 /lib/ld-linux-*.so.2target triplet *-alpine-linux-musl *-pc-linux-gnu可移植性 musl 静态链接的程序通常具有更好的跨发行版可移植性。 glibc 静态链接的程序可能因依赖 NSS 等机制而无法在 Alpine 上运行。编译器名称通常:arch-vendor-os-abi-tool具体差异在哪里1. GCC 的 “target triplet” 和 “specs”spec file: /lib/gcc/x86_64-alpine-linux-musl/11.2.1/specs# Alpine 的 GCC 被编译为x86_64-alpine-linux-musl# 而不是常见的x86_64-pc-linux-gnu这意味着默认包含头文件路径指向 Alpine 特有的位置默认使用 musl-gcc 行为即使命令叫 gcc自动设置 .interp 为 /lib/ld-musl-x86_64.so.12. CRTC Runtime Startup对象不同使用 crt1.o, crti.o, crtn.o 来自 musl而非 glibc这些对象定义了 _start 符号和初始化流程3. 链接脚本和默认库不同默认链接 -lc 时链接的是 libc.a 或 libc.so 来自 musl不是 glibc不支持某些 glibc 特有的 symbol如 __stack_chk_fail_guard四、如何验证1. 查看 gcc 默认链接了什么Alpine (musl) 下的例子$ gcc -Wl,--verbose | grep SEARCH_DIR\|libc\.# 你会看到它搜索 musl 的库路径比如SEARCH_DIR(/usr/x86_64-alpine-linux-musl/lib)WSL2 Ubuntu (glibc) 下的例子$ gcc -Wl,--verboseSEARCH_DIR(/usr/local/lib/x86_64-linux-gnu); SEARCH_DIR(/lib/x86_64-linux-gnu); SEARCH_DIR(/usr/lib/x86_64-linux-gnu); SEARCH_DIR(/usr/lib/x86_64-linux-gnu64); SEARCH_DIR(/usr/local/lib64); SEARCH_DIR(/lib64); SEARCH_DIR(/usr/lib64); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/x86_64-linux-gnu/lib64); SEARCH_DIR(/usr/x86_64-linux-gnu/lib);attempt to open /usr/lib/gcc/x86_64-linux-gnu/11/libc.so failedattempt to open /usr/lib/gcc/x86_64-linux-gnu/11/libc.a failedattempt to open /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libc.so succeededopened script file /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libc.so/usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libc.soopened script file /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libc.soattempt to open /lib/x86_64-linux-gnu/libc.so.6 succeeded/lib/x86_64-linux-gnu/libc.so.6/usr/bin/ld: ld-linux-x86-64.so.2 needed by /lib/x86_64-linux-gnu/libc.so.6/usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/Scrt1.o: in function _start:(.text0x1b): undefined reference to main/usr/bin/ld: link errors found, deleting executable a.outcollect2: error: ld returned 1 exit status2. 查看 gcc 目标架构$ gcc -v# 输出中会有类似Target: x86_64-alpine-linux-muslConfigured with: /path/to/configure --targetx86_64-alpine-linux-musl ...如果你想进一步探索什么是 ABIApplication Binary Interface使用 cross 和 none 工具链了解 newlib、glibc、musl 等 C 库
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

工控主机做网站服务器无锡做网站哪里好

第一章:Open-AutoGLM调用入门与环境准备在开始使用 Open-AutoGLM 前,需完成开发环境的配置与基础依赖的安装。该框架基于 Python 构建,支持主流操作系统平台,包括 Linux、macOS 以及 Windows(通过 WSL 推荐运行&#x…

张小明 2025/12/24 10:49:02 网站建设

临翔网站建设网站重要三要素

JSTL格式化区域设置与数据库操作详解 1. 确定格式化区域设置 在进行格式化操作时, <fmt:formatNumber> 、 <fmt:parseNumber> 、 <fmt:formatDate> 和 <fmt:parseDate> 等操作通常不需要使用 <fmt:setLocale> 来指定格式化区域设置…

张小明 2025/12/25 10:54:33 网站建设

做图标得英文网站wordpress安全设置

PyMC终极指南&#xff1a;贝叶斯建模从入门到实战 【免费下载链接】pymc Python 中的贝叶斯建模和概率编程。 项目地址: https://gitcode.com/GitHub_Trending/py/pymc 还在为传统统计方法无法量化不确定性而困扰吗&#xff1f;想要通过概率编程轻松构建贝叶斯模型吗&am…

张小明 2026/1/7 15:52:55 网站建设

网站建设设计广州图片网站 模板

2024年数据可视化终极指南&#xff1a;Awesome D3与现代前端框架的完美融合 【免费下载链接】awesome-d3 A list of D3 libraries, plugins and utilities 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-d3 在数字化转型的浪潮中&#xff0c;数据可视化已成为前…

张小明 2026/1/5 10:03:04 网站建设

环保网站设计医疗器械网官网

BluetoothKit终极指南&#xff1a;iOS蓝牙开发快速上手 【免费下载链接】BluetoothKit 项目地址: https://gitcode.com/gh_mirrors/blu/BluetoothKit 在移动应用开发领域&#xff0c;蓝牙通信一直是连接物理世界与数字世界的重要桥梁。然而&#xff0c;Apple的CoreBlue…

张小明 2025/12/24 10:43:47 网站建设

89点班组建设网站中国创业商机网

深入探索脚本编程:条件语句与代码片段的高效运用 在脚本编程的世界里,条件语句和代码片段是提升效率和增强脚本功能的关键要素。下面将详细介绍条件语句的使用方法以及如何创建和利用代码片段来简化脚本编写过程。 1. 条件语句的运用 1.1 文件和目录检查 在脚本中,我们常…

张小明 2025/12/31 12:09:01 网站建设