问题标签 [symbol-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.
compiler-construction - 编译器扫描器-符号表中的“位置”含义
我在编译器设计课程中读到,扫描的输出是一系列对(令牌代码,符号表中的令牌位置)。我对“位置”部分的含义有些困惑。当符号表表示为一个可以使用索引访问其元素的结构时,例如数组,“位置”是明确的,它表示数组中的第 1、2、99 个元素。例如,对于源代码:
扫描的输出将是流:( ..., (id,1), ..., (id,2), ..., (id,3) ) - 我没有描述其他标记简单 -符号表将是(a,b,c),因此 a 在位置 1,b 在位置 2,c 在符号表中的位置 3。
当符号表表示为二叉搜索树时会发生什么?对于相同的源代码,符号表树将有一个带有键 'b' 的根节点;b 的左节点将具有键 'a'并且 b 的右节点将具有键 'c'。现在扫描的输出应该是什么( ...,(id,?), ..., (id,?),..., (id,?))?如果我的树是使用 Node 类实现的,我应该这样做:( ...,(id, reference to Node its key = a),...)吗?
当符号表是哈希表时呢?例如,在 C# 中,我可以有一个 Hashtable 对象 HashST 并且扫描的输出看起来像这样:(..., (id,pointer to HashST["a"]),...)?
我真的不知道这是否是正确的方法,“位置”在树或哈希表中还有什么含义?
先感谢您!
c# - 为什么字典.Item() 在未找到的键上抛出异常,而 IDictionary.Item() 不应该?
这对我来说似乎很奇怪Dictionary.Item()方法抛出 KeyNotFoundException 而IDictionary.Item()没有。Dictionary 实现了这个接口。那么为什么会有这样的实现,我的形象打破了界面约定?
(此外,我在 Dictionary 背后的想法的符号类型结构似乎具有该方法不应抛出异常的约定。)
ruby - Ruby解释器神奇地分配未引用的变量?
到目前为止一切都很好,'foo' 是未定义的。
foo 应该仍然是未定义的,但是......
现在它存在于符号表中?由于永远不应该达到 if 分支中的逻辑,我会假设 foo 应该保持未定义,而不是突然为零?
c++ - 在 C++ 中从文件生成符号表
所以我试图从一个输入文件生成一个符号表,该文件包含 C++ 中这样的 C 样式嵌套块;
输出应如下所示。
我已经尝试了很多东西。使用向量、地图,现在我终于决定使用多重地图。无论我做什么,我都会遇到同样的问题,所以它可能与我选择的数据结构无关。
问题是,因为我逐行阅读,我最终会比我需要的更多。但是,如果我没有它在 for 循环中为每一行计算/迭代多图,而不是在它们被擦除/弹出后进行迭代。我不确定如何在逻辑上明智地使输出按原样显示,或者我是否走在正确的轨道上。
到目前为止,这是我的 .cpp 文件。忽略评论,因为它们是我目前选择不使用的过去尝试。同样在这个版本中,我没有使用向量,因此您可以忽略与向量相关的代码。我现在只是在使用多图。
这是我得到的输出。
c++ - 如何查看一个类的所有功能?
主要是我想看看编译器生成的函数(默认构造函数、复制构造函数、赋值运算符、移动赋值、析构函数)。
只想看看编译器为我生成了哪些函数。
我以为我可以在符号表中看到这一点,但我无法在名称修改的符号表中发现它们。我可以看到我定义的其他函数,但我不知道如何找到构造函数等。
有没有更好的方法来查看哪些函数与一个类相关联?
c - GDB - 如何处理“无符号表”
我有一个我想检查的应用程序,但我没有资源来重建它并创建像这里( gcc -g my_app.c
) 这样的符号表。
当我调用时,info locals
我收到以下错误“没有可用的符号表信息”
当我使用 Eclipse 时,即使我没有库的源代码,它也可以将当前函数的参数解析为arg0、arg1... argN,如果我没记错的话,还有对象的成员。
有什么方法可以生成自定义/通用/默认符号表,它可以满足 GDB 并允许我查看局部变量和参数的值?
javascript - JavaScript 是否具有类似于 php list 命令的语言结构?
JavaScript 是否有语言结构或类似于 php list 命令的东西?http://php.net/manual/en/function.list.php
此命令将在单个语句中将数组的值分配给变量。例如,给定数组:
list 命令会将每个数组元素值分配给命名变量:
这样:
因此,这是一种在一个语句中为多个变量赋值的简单方法。
JavaScript 是否有等效的东西,每个变量不必单独分配?
有没有办法使用对象的属性或数组的元素来做到这一点?如果没有,是否可以编写一个可以做到这一点的函数?如果这样做的唯一方法是通过函数,那么函数将需要访问定义变量的范围。
我在这个五年前的问题中尝试了解决方案:Javascript 等效于 PHP 的 list(),但它们不起作用。数组原型更改无法在我的 node.js 环境中分配变量,左手数组分配是 Chrome 中的引用错误。有人谈论一种实验性的新技术,但这种说法已经有好几年了。我想知道是否有比链接问题中列出的更好的解决方案。
javascript - 如何将函数的参数重新分配回原始参数名称?
我有一个函数可以重新排列另一个函数的参数以满足标准定义。
*** 是问题行,应该是“null null 1”以匹配重新分配的参数对象。
arguments 对象根据我的需要进行更改,main 调用的值“1”移动到最后一个参数。但是,映射到参数的变量名称在我移动参数对象后不会更改(请参阅最后一个标有 *** 的 console.log)。这需要为 null null 1 以匹配更改的参数对象)。
如何让 shiftArgs 函数重新分配变量 a、b 和 c 以匹配参数对象?
bc - 列出 bc 命令中定义的所有变量
是否可以在命令中列出所有变量(打印符号表)bc
?
例如
如果说“所有定义的变量”是模棱两可的,那么“所有非零变量”也应该是可以接受的。
c - 在加载的 ELF(.so 共享库)中挂钩和替换导出函数
我正在编写一些 C 代码来挂钩加载到内存中的 .so ELF(共享库)的某些功能。
我的 C 代码应该能够重定向另一个加载到应用程序/程序内存中的 .so 库的导出函数。
这里有一点详细说明:
Android 应用将加载多个 .so 文件。我的 C 代码必须查看属于另一个共享 .so 库(在本例中称为 target.so)的导出函数
这不是常规的 dlsym 方法,因为我不只是想要一个函数的地址,而是想用我自己的函数替换它;在那:当另一个库调用它自己的函数时,我的 hook_func 会被调用,然后我应该从我的 hook_func 调用 original_func。
对于导入功能,这可以工作。但是对于导出功能,我不知道该怎么做。导入函数具有符号表中的条目,这些条目在重定位表中具有相应的条目,最终给出全局偏移表(GOT)中的条目地址。但是对于导出函数,符号的 st_value 元素本身具有过程的地址而不是 GOT 地址(如果我错了,请纠正我)。
如何执行导出功能的挂钩?
从理论上讲,我应该得到导出函数st_value
的动态符号表条目()的元素的内存位置。Elf32_Sym
如果我得到那个位置,那么我应该能够用我的 hook_func 的地址替换那个位置的值。但是,到目前为止,我无法写入此位置。我必须假设动态符号表的内存是只读的。如果这是真的,那么在这种情况下解决方法是什么?
非常感谢您阅读并帮助我。
更新: LD_PRELOAD 只能用我自己的函数替换原来的函数,但是我不确定是否有任何方法可以调用原始函数。以我为例:
应用程序通过调用初始化音频引擎Audio_System_Create
并将AUDIO_SYSTEM
对象的引用传递给Audio_System_Create(AUDIO_SYSTEM **);
AUDIO API 分配此结构/对象并返回函数。现在,只要我可以访问该AUDIO_SYSTEM
对象,我就可以轻松地将回调附加到该对象并开始接收音频数据。因此,我的最终目标是获得对AUIOD_SYSTEM
对象的引用;在我的理解中,只有当我拦截该对象首先通过Audio_System_Create(AUIOD_SYSTEM **)
. 目前没有直接的方法来获取 android 的输出音频。(所有示例都只讨论录制来自麦克风的音频)
Update2: 正如 Basile 在他的回答中所建议的那样,我使用了 dladdr() 但奇怪的是它给了我与我传递给它的地址相同的地址。
这是我得到的结果:
entry_addr = 0x75a28cfc
entry_addr_through_dlysm =0x75a28cfc
符号名称为:AUDIO_System_Create
符号地址为:0x75a28cfc
这里通过dlysm得到或者通过ELF文件计算得到的地址就是程序的地址;而我需要这个地址本身所在的位置;这样我就可以用我的地址替换这个hook_func
地址。dladdr()
没有做我认为它会做的事。