`
chong_zh
  • 浏览: 72321 次
  • 来自: 杭州
社区版块
存档分类
最新评论

静态链接(binutils的ld)与动态链接(glibc的ld-linux)

 
阅读更多
链接器(英语:Linker),又譯為鏈結器、連結器,是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件。

所谓目标文件: Computer programs typically comprise several parts or modules; all these parts/modules need not be contained within a single object file, and in such case refer to each other by means of symbols. Typically, an object file can contain three kinds of symbols:
  • defined symbols, which allow it to be called by other modules,
  • undefined symbols, which call the other modules where these symbols are defined, and
  • local symbols, used internally within the object file to facilitate relocation.


链接工作(binutils的ld程序): When a program comprises multiple object files, the linker combines these files into a unified executable program, resolving the symbols as it goes along.Linkers can take objects from a collection called a library. Some linkers do not include the whole library in the output; they only include its symbols that are referenced from other object files or libraries. Libraries exist for diverse purposes, and one or more system libraries are usually linked in by default.

涉及重定位:The linker also takes care of arranging the objects in a program's address space. This may involve relocating code that assumes a specific base address to another base. Since a compiler seldom knows where an object will reside, it often assumes a fixed base location (for example, zero). Relocating machine code may involve re-targeting of absolute jumps, loads and stores.

动态链接技术(glibc的ld-linux:ld.so, ld-linux.so*):
Many operating system environments allow dynamic linking, that is the postponing of the resolving of some undefined symbols until a program is run. That means that the executable code still contains undefined symbols, plus a list of objects or libraries that will provide definitions for these. Loading the program will load these objects/libraries as well, and perform a final linking.
The dynamic linker can be run either indirectly by running some dynamically linked program or library (in which case no command-line options to the dynamic linker can be passed and, in the ELF case, the dynamic linker which is stored in the .interp section of the program is executed) or directly by running:
/lib/ld-linux.so.* [OPTIONS] [PROGRAM [ARGUMENTS]]




附:
linux下文件的类型是不依赖于其后缀名的,但一般来讲:

  • .o,是目标文件,相当于windows中的.obj文件
  • .so 为共享库,是shared object,用于动态连接的,和dll差不多
  • .a为静态库,是好多个.o合在一起,用于静态连接
  • .la为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息。可以用如下命令查看*.la文件的格式 $file *.la
  • *.la: ASCII English text
    所以可以用vi来查看其内容。

分享到:
评论

相关推荐

    binutils-2.15.92.0.2-13.i386.rmp/glibc-devel-2.17-55.el7.x86_64.rmp

    Binutils是一套用于处理二进制文件的工具集合,它包含了如ld(链接器)、as(汇编器)、objdump(反汇编器)和nm(符号表查看器)等工具。这些工具在软件开发过程中扮演了重要角色。例如,ld用于将多个目标文件链接...

    Glibc Binutils GCC 安装指南

    通常情况下,Glibc会被构建为共享库形式,以供其他程序动态链接。 #### 四、其他配置选项 除了上述提到的配置选项外,还有许多其他非默认选项,如: - `--build=BUILD`:指定构建目标平台。 - `--host=HOST`:...

    binutils-2.19

    例如,`./configure --target=arm-linux-gnueabi`将配置binutils为生成ARM架构的代码。 4. **编译和安装**:运行`make`和`make install`以编译源代码并将其安装到预定位置。 5. **验证**:通过测试交叉编译的工具链...

    Linux安装Oracle依赖包

    3. **binutils-2.20.51.0.2-5.34.el6.x86_64.rpm**:这是Linux系统中的二进制工具集合,包括as(汇编器)、ld(链接器)等,它们在编译和链接Oracle数据库组件时起着关键作用。 4. **libstdc++-devel-4.4.6-4.el6....

    Linux Oracle 11g rpm 包 64位

    3. binutils-2.20.51.0.2-5.36.el6.x86_64.rpm 和 binutils-2.20.51.0.2-5.20.el6.x86_64.rpm:这两个是binutils套件的不同版本,包含了一系列用于处理二进制文件的工具,如ld链接器和objdump反汇编器。 4. libstdc...

    Arm+Linux系统移植(非常好的移植文档很详细)

    - **arm-linux-ar和arm-linux-ranlib的使用**:介绍如何使用这些工具来创建和管理静态库。 - **arm-linux-objdump的使用**:介绍如何使用该工具来查看目标文件的信息。 - **arm-linux-readelf的使用**:介绍如何...

    red hat linux 9.0下安装oracle 8.1.7.doc

    - 解压`i386-glibc-2.1-linux.tar.gz`到根目录,然后创建链接使得`gcc`、`cc`指向低版本的编译器。 7. **降级Binutils**: - 卸载高版本的`binutils`,并使用低版本的`binutils-2.10.91.0.2-3.i386.rpm`进行强制...

    工具链使用的简单介绍

    静态链接是将目标文件静态地链接成可执行文件,而动态链接是将目标文件动态地链接成可执行文件。 加载 ---------- 加载阶段是编译过程的最后一个阶段,在这个阶段中,操作系统会将可执行文件加载到内存中,并开始...

    交叉编译工具链制作

    GNU 工具链软件包是交叉编译工具链的核心组件,它可以生成 gcc、g++、ar、as、ld 等编译链接工具,还可以生成 glibc 库和 gdb 调试器。GNU 工具链软件包可以生成针对不同体系结构的交叉编译工具链,例如 arm-linux-...

    linux 下GNU工具链的使用介绍

    `-static` 或 `-shared` 决定静态或动态链接, `-E`、`-S`、`-c` 控制编译过程的不同阶段, `-o` 指定输出文件名, `-v` 输出详细信息。 - **基于profiling的优化**:GCC可以通过 `-fprofile-arcs` 选项收集程序...

    依赖包_linux_

    - `libgcc_s.so.1`:GCC的静态链接库,确保动态链接器能找到所需函数。 安装这些依赖包通常是通过运行`yum install`或`dnf install`命令来完成的,根据文件名列表"依赖包",可能包含了所有这些必要组件的RPM包。在...

    Red Hat Enterprise Linux 7.0 x86_64下安装Oracle 12c R1

    - `binutils`, `compat-libcap1`, `compat-libstdc++-33`, `gcc`, `gcc-c++`, `glibc`, `glibc-devel`, `ksh`, `libgcc`, `libstdc++`, `libstdc++-devel`。 - 如果缺少任何软件包,则可以通过 `yum install` 命令...

    Fedora11-GCC4.4.0-rpm包

    4. `binutils-2.19.51.0.2-17.fc11.i586.rpm`:这是GNU二进制工具的集合,包括as(汇编器)、ld(链接器)、objdump(对象文件分析工具)等,是编译过程中的必备工具。 5. `gdb-6.8.50.20090302-21.fc11.i586.rpm`...

    RHEL4安装Oracle10g

    在本文中,我们将深入探讨如何在Red Hat Enterprise Linux 4.0(RHEL4)操作系统上安装Oracle 10g数据库。这是一个关键的任务,因为正确的配置和安装过程对于确保数据库的稳定性和性能至关重要。 首先,我们来看...

    centos6.6安装oracle11g2,64位依赖包

    4. **kernel-headers-2.6.32-642.el6.x86_64.rpm**:内核头文件是开发和编译针对特定内核版本的模块所必需的,包括Oracle的动态链接库。它们包含了内核API的定义。 5. **glibc-2.12-1.25.el6.x86_64.rpm**:这是...

    Linux下傻瓜式安装Oracle11g服务器

    其中,`<package_name>`可以替换为`binutils`, `compat-libstdc++-33`, `elfutils-libelf`, `gcc`, `gcc-c++`, `glibc`, `glibc-devel`, `libaio`, `libaio-devel`, `libgcc`, `libstdc++`, `libstdc++-devel`, `...

    制作GNU-ARM交叉编译工具链.txt

    这意味着会生成动态链接库,而不是静态库。 #### 构建Binutils 构建Binutils时,需要使用`configure`脚本指定目标平台和安装路径等信息: ```bash ${SOURCE_DIR}/${PACKAGE_BINUTILS}/configure \ --target=${...

    mingw-w64-v10.0.0-20230212.rar

    此外,MingW-w64 还支持静态和动态链接,允许开发者根据需求选择合适的链接方式。 总的来说,MingW-w64 是一个强大的工具,为 Windows 开发者提供了一套完整的、与 Linux 平台相类似的开发环境。无论是个人项目还是...

Global site tag (gtag.js) - Google Analytics