首页 > 其他分享 >转: ltrace 是如何工作的(2016)

转: ltrace 是如何工作的(2016)

时间:2024-03-29 17:14:27浏览次数:31  
标签:ltrace 调用 函数 如何 地址 PLT GOT 2016

http://arthurchiao.art/blog/how-does-ltrace-work-zh/

strace 是一个系统调用,也是一个信号跟踪器(signal tracer),

  • 主要用于跟踪系统调用,打印系统调用的参数、返回值、时间戳等很多信息。
  • 也可以跟踪和打印进程收到的信号。
  • 在前一篇文章strace 是如何工作的 中介绍过, strace 内部基于 ptrace 系统调用。

ltrace 是一个函数库调用跟踪器(library call tracer)

  • 顾名思义,主要用于跟踪程序的函数库调用信息。
  • 它也可以像 strace 一样跟踪系统调用和信号。
  • 它的命令行参数和 strace 很相似。
  • ltrace 也是基于 ptrace。

虽然 strace 和 ltrace 底层都是基于 ptrace 系统调用, 但跟踪库函数和跟踪系统调用还是有很大差别的,这就是为什么会有 ltrace 的原因。

 

#重要概念

共享库可以被加载到任意地址。这意味着,共享库内的函数地址只有在运行时加载以后才能确定。 即使重复执行同一程序,加载同一动态库,库内的函数地址也是不同的。那么,程序是如何调用地址未知的函数的呢?

简短版的回答是:二进制格式、操作系统,以及加载器。在 Linux 上,这是一 支程序和动态加载器之间的曼妙舞蹈

下面是详细版的回答。

Linux 程序使用 ELF binary format,它提供了 许多特性。出于本文目的,我们这里只介绍两个:

  • 过程链接表(Procedure Linkage Table,PLT
  • 全局偏移表(Global Offset Table,GOT

库函数在 PLT 里都有一组对应的汇编指令,通常称作 trampoline,在函数被调用的时候执行。

PLT trampoline 代码

PLT trampoline 都遵循类似的格式,下面是一个例子:

PLT1: jmp *name1@GOTPCREL(%rip)
      pushq $index1
      jmp .PLT0
  • 第一行代码跳转到一个地址,这个地址的值存储在 GOT 中。
  • GOT 存储了绝对地址。这些地址在程序启动时初始化,指向 PLT pushq 指令所在的地址(第二行代码)。
  • 第三行 pushq $index1 为动态连接器准备一些数据,然后通过 jmp .PLT0 跳转到另一段代码,后者会进而调用动态链接器。

动态链接器通过 $index1 和其他一些数据来判断程序想调用的是哪个库函数,然后定位 到函数地址,并将其写入 GOT,覆盖之前初始化时的默认值。

当后面再次调用到这个函数时,就会直接找到函数地址,而不需再经过以上的动态链接器查 找过程。

流程总结

总结起来:

  1. 程序加载到内存时,程序和每个动态共享库(例如 DSO)通过 PLT 和 GOT 映射到内存
  2. 程序开始执行时,动态共享库里的函数的内存地址是未知的,因为动态库可以被加载到程序地址空间的任意地址
  3. 首次执行到一个函数的时候,执行过程转到函数的 PLT,里面是一些汇编代码(trampoline)
  4. trampoline 组织数据,然后调用动态链接器
  5. 动态链接器通过 PLT 准备的数据找到函数地址
  6. 将地址写入 GOT 表,然后执行转到该函数
  7. 后面再次调用到这个函数时,不再经过动态链接器,因为 GOT 里已经存储了函数地址,PLT 可以直接调用

 

标签:ltrace,调用,函数,如何,地址,PLT,GOT,2016
From: https://www.cnblogs.com/ycjstudy/p/18104215

相关文章

  • 150. 如何使用 SAPGUI 中的树控件绘制树状数据结构
    大家在按照本文介绍的步骤进行学习之前,请务必先完成这两篇前置知识的学习:148.使用SAPGUI的Docking控件将屏幕划分成若干子区域149.如何在SAPGUI的ABAP报表里显示图片树形结构能够自然地表达层次化数据,如公司的组织架构、产品目录或项目任务的分解。在SA......
  • 【计算机网络】http协议的原理与应用,https是如何保证安全传输的
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 【python】深入探讨flask是如何预防CSRF攻击的
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 如何高效的开展app的性能测试?
    APP性能测试是什么从网上查了一下,貌似也没什么特别的定义,我这边根据自己的经验给出一个自己的定义,如有巧合纯属雷同。客户端性能测试就是,从业务和用户的角度出发,设计合理且有效的性能测试场景,制定各性能场景下的客户端性能指标(内存、CPU、卡顿数、帧率、电量、加载时长等),并制......
  • 如何防范邮件泄密风险来保护企业敏感信息
    邮件系统作为企业内部通信的主要载体,其安全性直接决定了企业信息的安全。于此同时,随着大数据和云计算的发展,数据对网站至关重要,尤其是基于云端存储的数据,一旦泄露,将给企业和用户带来巨大损失。根据调研,24%的企业电子邮件用户曾接收到过其他企业的机密信息。这直接触发了一系列关......
  • Facebook是什么?有什么功能?如何利用Facebook运营?
    Facebook,也常被人们称为“脸书”、“脸谱”等,是美国的社交网络服务及社会化媒体网站,拥有超过20亿的月活跃用户,对于众多商家而言,Facebook以其广泛的用户基础和强大的社交影响力,成为了一个理想的社媒营销和广告投放渠道。本篇文章就来向大家分享什么是Facebook、它的功能有哪些以......
  • Linux电脑如何下载QGIS?
      本文介绍在Linux操作系统Ubuntu版本中,通过命令行的方式,配置QGIS软件的方法。  在Ubuntu等Linux系统中,可以对空间信息加以可视化的遥感、GIS软件很少,比如ArcGIS下属的ArcMap就没有对应的Linux版本(虽然有ArcGISServer,但是其没有办法对空间数据加以可视化)。但是,对于Ubuntu等......
  • 如何在Java中读取超过内存大小的文件
    读取文件内容,然后进行处理,在Java中我们通常利用Files类中的方法,将可以文件内容加载到内存,并流顺利地进行处理。但是,在一些场景下,我们需要处理的文件可能比我们机器所拥有的内存要大。此时,我们则需要采用另一种策略:部分读取它,并具有其他结构来仅编译所需的数据。接下来,我们就来......
  • 数据可视化是如何为智慧旅游进行服务的?
    在数字化浪潮席卷全球的今天,数据可视化技术已成为链接信息与用户的重要桥梁,尤其在智慧旅游领域,它的作用更是日益凸显。随着智慧旅游的概念越来越被重视,数据可视化成为其提供高效、直观服务的关键手段之一。本文将探讨数据可视化如何为智慧旅游服务,为游客提供更加丰富、便捷的旅游......
  • 如何安装和使用Docker
    本文深入解析Docker,一种革命性的容器化技术,从其基本概念、架构和组件,到安装、配置和基本命令操作。文章探讨了Docker在虚拟化、一致性环境搭建及微服务架构中的关键作用,以及其在云计算领域的深远影响,为读者提供了关于Docker技术全面且深入的洞见。关注【TechLeadCloud】,分享互......