首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何防止GNU ld对目标文件进行重新排序?

GNU ld(GNU链接器)是一个用于将目标文件链接成可执行文件或共享库的工具。它在链接过程中会对目标文件进行重新排序,以优化代码的执行效率。然而,有时候我们希望禁止GNU ld对目标文件进行重新排序,可以采取以下方法:

  1. 使用链接器选项:可以通过在链接命令中添加选项来控制GNU ld的行为。其中,--no-reorder选项可以禁止链接器对目标文件进行重新排序。例如:ld --no-reorder file1.o file2.o -o output这样链接器将不会对目标文件进行重新排序。
  2. 使用链接脚本:链接脚本是一个文本文件,用于指定链接器在链接过程中的行为。可以通过编写自定义的链接脚本来控制GNU ld的行为,包括禁止重新排序。例如,在链接脚本中可以使用SORT_NONE命令来禁止重新排序:SECTIONS { .text : { *(.text) SORT_NONE } ... }然后在链接命令中使用该链接脚本:ld -T script.ld file1.o file2.o -o output这样链接器将按照链接脚本中的规定进行链接,禁止重新排序。

需要注意的是,禁止GNU ld对目标文件进行重新排序可能会影响代码的执行效率和空间利用率。在某些情况下,重新排序可以提高代码的局部性,从而提高执行效率。因此,在决定是否禁止重新排序时,需要权衡代码的性能和其他需求。

推荐的腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

浅谈Linux的动态链接库

上一篇我们分析了Hello World是如何编译的,即使一个非常简单的程序,也需要依赖C标准库和系统库,链接其实就是把其他第三方库和自己源代码生成的二进制目标文件融合在一起的过程。...共享库的之间隔离决定了共享库可以进行小版本的代码升级,重新编译并部署到操作系统上,并不影响它被可执行文件调用。...静态链接库的任何函数有了改动,除了静态链接库本身需要重新编译构建,依赖这个函数的所有可执行文件都需要重新编译构建一遍。...每次在/lib和/usr/lib这些路径下安装了新的库,或者更改了/etc/ld.so.conf文件,都需要调用ldconfig命令来做一次更新,重新生成软连接和Cache。...LD_PRELOAD是具体的目标文件列表(A list of shared objects);LD_LIBRARY_PATH是目录列表(A list of directories)。

8.9K30

【Linux】《how linux work》第十五章 开发工具

至少,你应该能够识别开发工具,并且如何运行它们有一些了解。...目标文件是处理器几乎可以理解的二进制文件,只是还有一些松散的部分。 首先,操作系统不知道如何运行目标文件,其次,你可能需要将多个目标文件和一些系统库组合起来,才能生成一个完整的程序。...可执行文件如何查找共享库 如何将程序与共享库进行链接 常见的共享库陷阱 The following sections tell you how to use and maintain your system.../etc/ld.so.cache file by hand with the following command 如果您修改了ld.so.conf或其中一个共享库目录进行更改,必须手动使用以下命令重新构建...如果你如何设计和实现编译器感兴趣,可以参考Alfred V.

9610
  • 程序一定要从main函数开始运行吗?

    对于静态链接先提出两个问题: Q: 每个目标文件都有好多个段,目标文件在被链接成可执行文件时,输入目标文件中的各个段如何被合并到输出文件?...如何指定程序入口 在ld链接过程中使用-e参数可以指定程序入口,由于一段简短的printf函数其实都依赖了好多个链接库,我们也不太方便使用链接脚本将目标文件与所有这些依赖库进行链接,所以使用下面这段内嵌汇编的程序来打印一段字符串.../test hello 如何使用自定义链接脚本实现自定义段的功能 在ld链接过程中使用-T参数可以指定链接脚本,通过ld -verbose可以查看默认的链接脚本,原文太长,这里简单截取了一部分: $...ld -verbose GNU ld (GNU Binutils for Ubuntu) 2.30 Supported emulations: elf_x86_64 elf32_x86_...I:该符号另一个符号的间接引用 N:debug符号 R:该符号位于只读数据区 T:该符号位于代码段 U:该符号在当前文件未定义,定义在别的文件中 ?

    1.2K30

    吴章金: 如何创建一个*可执行*的共享库

    license: "cc-by-nc-nd-4.0" description: "本文手把手指导如何创建一个可以执行的共享目标文件" 前言 前段时间,有多位同学在“泰晓原创团队”微信群聊到 C 语言相关的两个问题...: 如何让共享库文件也可以直接执行 如何在可执行文件中用 dlopen 解析自身的函数 这两个需求汇总起来,可以大体理解为如何让一个程序既可以作为共享库,又能够直接运行。.../ld-linux.so.2: symbolic link to ld-2.23.so $ file /lib/i386-linux-gnu/ld-2.23.so /lib/i386-linux-gnu...先来看看两类文件的区别 当前 Linux 下面的二进制程序标准格式是 ELF,这类格式可以用来表示 4 种不同类型的文件: 可重定位目标文件(.o),用于静态链接 可执行文件格式,用于运行时创建进程映像...共享目标文件(.so,共享库),协同可执行文件创建进程映像 Core dump(core),运行过程中崩溃时自动生成,用于调试 我们来看中间两类: 可执行文件 如果不引用外部库函数,那么所有符号地址是确定的

    1.1K20

    Linux动态链接库.so文件的创建与使用

    介绍         使用GNU的工具我们如何在Linux下创建自己的程序函数库?...静态函数库对开发者来说还是很有用的,例如你想把自己提供的函数给别人使用,但是又想函数的源代码进行保密,你就可以给别人提供一个静态函数库文件。...创建一个静态函数库文件,或者往一个已经存在地静态函数库文件添加新的目标代码,可以用下面的命令:          ar rcs my_library.a file1.o file2.o  这个例子中是把目标代码...这些函数库如何使用 在基于GNU glibc的系统里,包括所有的linux系统,启动一个ELF格式的二进制可执行文件会自动启动和运行一个program loader。...因此,GNU loader通常限制或者忽略用户这些变量使用setuid和setgid。

    9.2K51

    交叉编译学习笔记(一)——交叉编译和交叉工具链

    交叉编译学习笔记(一)——交叉编译和交叉工具链 最近看论文看的烦,又重新拾起之前没有完全完成的交叉编译,准备在网上找资料,好好研究一下。...) 输出目标: 程序的可执行文件 可被其他可执行文件/库文件调用的库文件 工具:链接器(ld) 这里有一个不得不提的二进制工具集——GNU Binutils。...主要包含的工具有: ld:链接器,将多个目标文件链接成一个可执行文件/目标文件 as:汇编器,将汇编源代码编译为机器代码 ranlib:静态库的符号索引表进行更新 addr2line:将地址转换为行号...readelf:显示ELF格式的目标文件信息 size:显示目标文件或档案文件的节(section)大小 strings:显示文件中可打印字符串信息 其中最重要的工具是ld, as。...即先编译,后链接,最后进行其他后期处理(如用objcopy操作相应目标文件等)。 如此将程序编译链接相关工具,按照先编译后链接的内在编译逻辑串起来,就成了我们所谓的工具链。 3.

    5.3K70

    关于gcc、glibc和binutils模块之间的关系

    一、关于gcc、glibc和binutils模块之间的关系 1、gcc(gnu collect compiler)是一组编译工具的总称。...2、binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具...(11)locale,本地化 (12)login,虚拟终端设备的管理,及系统的安全访问 (13)malloc,动态内存的分配与管理 (14)nis (15)stdlib,其它基本功能 二、在现有系统上如何升级...: (1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看 (2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时...,由ldconfig生成二进制的ld.so.cache中 2、编译时,搜索库的路径顺序如下: (1)ld-linux.so.6由gcc的spec文件中所设定 (2)gcc –print-search-dirs

    2.5K91

    永远修复不完的Linux本地ASLR漏洞

    ASLR能够在每次运行可执行文件的时候通过基地址随机映射的方式来为其随机分配地址空间。ASLR存在的目的,就是为了防止那些需要了解内存地址来利用内存崩溃漏洞的攻击行为。...2009年,谷歌安全团队的Tavis Ormandy和Julien Tinnes曾在CanSecWest就Linux ASLR这个话题进行过一次演讲【PDF】,并在演讲中演示了如何通过/proc/[pid.../ld.so7f508c317000-7f508c318000 rw-p 00021000 08:04 7605349 /lib/x86_64-linux-gnu/...漏洞分析 但是,这个修复方案是存在问题的,因为还有其他的/proc/[pid]/伪文件可以泄露当前映射的内存地址,而它们的权限检查仍然是在read()处进行的。...Linux的内核开发者们似乎/proc/[pid]/的安全问题也缺乏一定的认识,因此该问题才迟迟得不到适当的解决。

    1.4K20

    【教程】如何用GCC“零汇编”白嫖MDK

    那么这些差异我们在MDK中使用gcc进行开发有什么意义呢?我们需要做哪些工作准备工作呢?...总的来说,问题集中在以下几个方面: 编译器的获取和集成 如何芯片的启动 如何描述目标软件的地址空间布局 如何编译选项进行配置 如何进行代码的优化 接下来,我们就有针对性的为您解答这些问题。...,我们就可以借助它根据目标芯片的实际情况描述地址空间布局,打开gcc_arm.ld,可以看到如下的内容: ?...目标芯片没有针对MDK的CMSIS-Pack,而只提供了目标芯片的头文件(包含了寄存器定义等等) 此时,我们需要将目标芯片的头文件拷贝到工程目录下,并收工将对应路径添加到编译器的头文件搜索列表中。...这里因为我们假设你直接将头文件保存在了工程目录下,因此这里的搜索路径就是"工程所在当前目录"——直接用"."就可以了: ? 完成了上述步骤,基本上就完成了新的目标芯片的最基础支持。

    1.9K10

    详解共享库的动态加载

    这边文章不是一个如何引导,尽管它确实展示了如何编译和调试共享库和可执行文件。为了解动态加载的内部工作方式进行了优化。写这篇文章是为了消除我在该主题上的知识欠缺,以便成为一名更好的程序员。...-c: 不尝试任何链接(只编译) random.cpp: 输入文件 接下来,我们将目标文件编译到共享库中: $ clang++ -shared -o librandom.so random.o 参数-...我们的依赖项中的每个共享库都按顺序在以下位置进行搜索: 可执行文件rpath中列出的目录; LD_LIBRARY_PATH环境变量中的目录,该变量包含以冒号分隔的目录列表(例如:/path/to/libdir...它总是放置可执行文件的目录。 请注意,我们需要对美元符号进行转义(或使用单引号),以便我们的shell不会尝试进行扩展。.../etc/shadow中,所以问题来了,非root用户如何更改此文件?

    3.1K20

    怎样在 Linux 中使用动态和静态库

    为了让你熟悉这个话题,我准备了一个小巧的 应用例子 来展示在普通的 Linux 发行版(在其他操作系统上未验证)上是经常是如何处理库的。...静态库是多个 目标(object)文件的 归档(archive)(ar)。这些目标文件通常是 ELF 格式的。...它展示了两个目标文件: $ ar -t libmy_static.a libmy_static_a.o libmy_static_b.o 你可以用 ax -x 命令来提取归档文件文件...被提出的都是 ELF 格式的目标文件: $ ar -x libmy_static.a $ file libmy_static_a.o libmy_static_a.o: ELF 64-bit LSB relocatable...新手来说,与常用库(例如 bizp2)版本不兼容相关的问题往往十分令人困惑。一种方法是把该仓库的路径加入到环境变量 LD_LIBRARY_PATH 中来告诉链接器去哪里找到正确的版本。

    2K21

    GCC写个库给你玩,就这?

    前言 什么是GCC GCC原名为 GNU C语言编译器 「GCC」(GNU Compiler Collection,GNU编译套件) 是由GNU开发的编程语言编译器。...c 通知gcc取消连接步骤,即编译源码,并在最后生成目标文件 -w 不产生任何警告信息 -Wall 使gcc文件的代码有问题的地方发出警告 -Idir 指定 include 包含文件的搜索目录 -Ldir...-lLib 在程序编译的时候,指定使用的库 -g 在目标文件中嵌入调试信息,以便gdb之类的调试程序调试 -D 允许从编译程序命令行进行宏定义符号 gcc的使用示例: gcc -E hello.c -...o hello.i #hello.c文件进行预处理,生成了hello.i 文件 gcc -S hello.i -o hello.s #预处理文件进行编译,生成了汇编文件 gcc -c hello.s...-o hello.o #汇编文件进行编译,生成了目标文件 gcc hello.o -o hello #目标文件进行链接,生成可执行文件 gcc hello.c -o hello #直接编译链接成可执行目标文件

    1.1K10

    Linux系统下刨析hello world背后的秘密

    需要不断地它们进行思考和理解,只有这样才能写出高可靠性的Linux程序。...编译编译过程是源代码进行语法分析,并优化产生对应的汇编代码的过程。同样使用gcc也可得到汇编代码gcc -S helloworld.c -o helloworld.s。...gcc的-S选项会让gcc在编译完成后而停止,这样就会产生对应的汇编文件。 汇编汇编的过程比较简单,就是将源代码翻译成可执行的指令,并生成目标文件。...它就是将各个目标文件,包括库文件链接成一个可执行程序。在这个过程中,在Linux环下,该工作是由GNU的链接器ld完成的。 2. hello world可执行程序是什么文件?...3.hello world是如何在系统上运行的? 当我们在Linux系统运行helloworld时,它是如何运行的。或者说./hellworld都经历了哪些操作过程。

    58920
    领券