问题标签 [jump-table]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 查找表和跳转表的区别
我知道jump tables
主要用于在程序集中创建 switch 语句:
在这种情况下,跳转只是一个指向必须工作的内存地址的instructions
指针case 5
。
如果我没记错的话,alookup table
在数组中有预先计算的结果吗?所以不是编写代码来计算它们,而是返回数组索引?有点像HashMap
.
以上两个听起来跟我很像,是不是基本一样?一个指向指令,另一个返回预先计算的结果?
c - 有没有办法在 C 代码注释中添加 *called* 和 *called by* 函数以供 Doxygen 使用?
我正在开发一个主要是基于命令的系统的 C 项目。大多数函数是从一个中央命令处理程序调用的,该处理程序解析一个命令字符串,然后通过存储在一个大数组(跳转表)中的函数指针调用适当的函数。
Doxygen 的解析无法识别此中央命令处理程序函数作为所有这些“命令”函数的调用源,因此它无法生成调用图或被调用图。
如果可能的话,我想覆盖它。所以我的问题是;有没有办法在注释块中添加信息,告诉 Doxygen,一些函数(比如funcCaller
)调用另一个函数(比如funcCallee
),所以它可以显示在调用图中?
如果不是,那么记录此类系统功能的典型方法是什么?
assembly - 如何在 JMP 指令中使用跳转表?
这是我的代码(我知道这是错误的):
javascript - 为什么我不能使用跳转表重构那些累积的 if?
我尝试做一个小的重构,但它破坏了所有测试。
我有很多如果我想通过使用跳表来摆脱。
我想从这里出发:
到这里 :
我没有任何有意义的错误消息,如果什么都没发生,我可以观察到我所有的测试都失败了。
c - 解释程序集跳转表
我试图逐行解释这个汇编代码在做什么,但当我看到这个汇编中的跳转表时,我发现自己真的很困惑。这是从教科书练习问题 3.63 中摘录的,但没有解释 -因此我为什么在这里问它。目标是对提供的汇编列表进行逆向工程,并编写可以生成它的 C 代码(感觉 switch 语句体)。请帮忙 :(
教科书是:Randal E. Bryant, David R. O'Hallaron - Computer Systems。程序员的视角 [第 3 版](2016 年,Pearson)
qn 3.63
我不确定如何“解码”它或如何知道它指向的位置。
跳转表位于不同的内存区域。我们可以从第 5 行的间接跳转中看到,跳转表从地址 0x4006f8 开始。使用 GDB 调试器,我们可以使用命令 x/6gx 0x4006f8 检查组成跳转表的六个 8 字节内存字。GDB 打印以下内容:
(gdb) x/6gx 0x4006f8
0x4006f8: 0x00000000004005a1 0x00000000004005c3
0x400708: 0x00000000004005a1 0x00000000004005aa
0x400718: 0x00000000004005b2 0x00000000004005bf
我知道这行 40059a: ff 24 f5 f8 06 40 00 jmpq *0x4006f8(,%rsi,8)
正在跳转到表格,但我不确定如何
1) 解释跳转表 [每个地址对应于什么, 6 个值中的每一个是什么
意思/保持]
2)对其进行逆向工程以获得 switch 语句的不同情况。
任何帮助表示赞赏,谢谢:)
c++ - Qt No such slot 使用跳转表
我正在尝试创建多个 QCheckBox 而不使用 for 重复代码。问题是对于连接我需要一个跳转表数组。跳转表声明没问题,但 Qt 找不到插槽。
这是一个简化的示例:
PD:m_jumpTable 是对象的私有变量。
PD2:索引 i 这不是我用“0”测试它的问题。
risc - 哈佛架构微处理器和 GCC 跳转表放置的概念问题
我正在从头开始开发流水线NIOS2微处理器(英特尔 FPGA 生态系统的一部分)作为学习练习。这是一个哈佛架构处理器,具有独立的指令和数据存储器总线。
当我编译一个 C case 语句时,GCC 会创建一个跳转表,并将其与代码的其余可执行部分直接相邻。这会产生一个问题,因为处理器通过数据存储器总线加载跳转表值,该总线未连接到程序存储器。
我知道在实践中,单独的内存总线是通过缓存层次结构连接的,但是我没有缓存,并且我在两条总线之间保持了严格的分离。
作为一种解决方法,我将程序存储器设为双端口并将两条总线连接到它,但这似乎不是正确的解决方案。
我有没有办法指示 GCC 将跳转表和可执行代码分成不同的部分?如果没有,应该有吗?思考这个问题的正确方法是什么?
compilation - 每种语言是否将跳转表编译到自定义位置,或者 ELF / PE 标头中是否有特定位置供它们使用?
我试图弄清楚跳转表(将子程序名称与其地址配对的数据表)在可执行文件中的位置,以及它是否基于语言、编译器,或者是否有标准放置可能在 PE 的标头中/ELF 二进制文件。它是哪一个?我怎样才能找到这些表格或找到有关它们放置位置的文档?
到目前为止我尝试了什么:
首先,我阅读了 PE / ELF 标头的每个部分,并不确定哪一个是跳转表。
因为我发现学习编译器如何工作的前景非常令人生畏,所以我想到的最直接的解决方法是使用子例程反汇编二进制文件并找到引用该跳转目标和其他的二进制文件的一部分。在编译为 ELF 格式的C 程序开始时,我发现了以下部分:
我认为这可能是跳转表的样子,这些地址是各种动态链接库的偏移量。我之前曾看到一个带有 .plt 的 ELF 标头部分的引用,但最初并不清楚它是否是一个跳转表。进一步研究表明:
PLT代表Procedure Linkage Table,简单地说,用于调用在链接时地址未知的外部过程/函数,并在运行时由动态链接器解析。
GOT 代表 Global Offsets Table,同样用于解析地址。PLT 和 GOT 以及其他重定位信息都在本文中详细解释。
我仍在努力寻找本节中的哪个跳转(如果有)指向我程序中的子例程。也许那个 GOT 是我接下来需要看的地方。
如果需要更多上下文,这就是我要问的原因:
我一直在研究二进制补丁,尤其是用于跟踪恶意软件行为的挂钩技术,以及恶意软件如何阻止这种跟踪。钩子(只是将控制流重定向到中间函数,然后重定向到最初预期的目标的指令)可以去很多地方,例如修补到内存中的共享二进制文件(libs)中,甚至修补到内核子例程中,但如果我理解正确地,它们有时也被直接注入到可执行二进制文件中的子例程中。
我正在研究的是攻击者阻止这些钩子放置在二进制文件中的可能性。假设攻击者从恶意软件的执行开始就使用了一个不确定的(从受害者的角度来看)跳转目的地。现在假设分析师或自动启发式分析工具试图在沙盒环境中反汇编程序以确定程序的行为,但程序为该跳转目标地址访问的 Web 服务器将仅返回一个入口点对程序在未来某个日期执行时的恶意控制流。在此之前,它会返回一个地址,使程序以良性方式运行。这是教科书式的规避,由于 x86/-64 架构的可变长度特性而成为可能。我最近发表了一篇根据我的理解将问题集可视化的图表。
但是如果编译器在程序中建立了跳转表,分析人员或威胁检测系统仍然可以知道入口点的位置以跳转到并分析这些子程序。一旦这些子例程在目标条件下在运行时执行,还可以分析寄存器以找到执行例程的地址(x86 调用约定包括此信息,以便子例程知道返回到哪里),并从分析人员还可以知道其他有效的指令边界以开始反汇编。
我对编译器的工作原理几乎一无所知,并且已经阅读了 PE / ELF 文件头的规范,但也许我错过了一些东西。我真的很感激一个指向正确方向的指针。
optimization - 为什么编译器不能创建小跳转表而不是分支?
这可能是一个愚蠢的问题,出于无知而问。
这是一个描述分支预测的链接。看起来这在哑 CPU 上效率不高,为什么编译器不能只生成一个二元素跳转表?看看下面的代码:
使用编译器资源管理器,这会生成以下机器代码 (-O0):
这当然有一个分支,而以下代码:
生成:
其中大部分是为设置跳转表而生成的。这里没有分店。 在这里,我将两种方法的速度与 -O0 进行比较。跳转表始终比 if 语句快,这让我感到惊讶,因为我认为跳转表的优化程度较低。
也许我的测试不准确?
问题:
- 在一般环境中哪个更快,优化可能是 O1 或 O2?
- 当我将优化设置为 O3 时,if 语句变得非常快。为什么是这样?编译器做了哪些优化?