我有一组在Perl中声明的常量:
use constant C1 => 111;
use constant C2 => 222;
..
use constant C9 => 999;
my $which_constant = "C2";
Run Code Online (Sandbox Code Playgroud)
我如何构造一个Perl表达式,该表达式基于$which_constant派生用该变量的值命名的常量的值 - 例如"222".
请注意,我无法更改上述任何条件 - 它们是真实场景的简化:我有一个模块(我无法控制)从中导入这些常量.其中一个常量的名称由用户从命令行提供.我需要访问适当的常量值.
我一直在靠墙撞击(主要围绕各种怪异的glob构造),但它们都不起作用.
PS如果解决方案访问其原生模块中的常量 - 比如说My::Constants::C2(无需导入它们),甚至更好,但不是必需的 - 我可以main::轻松导入正确的常量My::Constants->import($which_constant).是的,最重要的是,默认情况下不会导出te常量,因此需要显式的import()调用.
我试过的一些事情:
main::$which_constant - 语法错误
main::${which_constant} - 语法错误
${*$which_constant} - 返回空值
*$which_constant - 返回"*main :: C2"
${*${*which_constant}} - 空
我试图通过使用eclipse 从我的语法(使用antlr完成)构建一个符号表.但是我不知道从什么开始.我想我在某处读到你需要antlr生成的解析器和词法分析器才能做到这一点.有人知道一个简单的例子,以便我能理解它是如何工作的吗?
我是lex和yacc以及编译器设计的新手.我想知道在哪个阶段(词法,句法或任何其他阶段)以及如何生成符号表?
我是否可以简要描述y.output文件,该文件是通过给yacc提供-v选项生成的.我试图查看它但没有得到太多信息.
我能否知道除了编译器设计之外还使用lex和yacc的其他应用程序.
在阅读不同的数据结构时,发现编译器使用的Symbol表被归类为数据结构。
有人可以解释一下符号表数据结构和哈希表之间的区别吗?
我想知道是否只有一个符号表存储有关源文件的所有信息,还是有多个符号表相互堆叠,并且仅在当前作用域与该表相关时才获取。
例如说我有两种方法
int foo(int a){
int b;
bar(b);
...
}
double bar (int a){
int b;
...
}
Run Code Online (Sandbox Code Playgroud)
这里两个中的a和b的作用域不同,因此,如果符号表堆叠在一起,则在执行foo时会首先获取与foo相关的符号表。但是,在执行bar时,bar的符号表堆叠在foo的上面,因此当前符号表包含bar的a和b的信息。
如果符号表是集中式的,则foo的信息和bar的信息都驻留在一个符号表中,但是可能有一些条目指定foo中的a,b属于foo的范围,而bar中的a,b属于bar。没有其他符号表可参考
以上是我对符号表的假设。请告诉我哪一个是真实的案例,并在其中填入更多详细信息。
谢谢
我想将反汇编风格设置为英特尔......我尝试了以下...................................... 。
$ gdb -q
/root/.gdbinit:1:源命令文件中出现错误:
未加载符号表。使用“文件”命令。
(gdb) 设置反汇编风味英特尔
未加载符号表。使用“文件”命令。
我已在文件 ~/.gdbinit 中输入设置“反汇编风味英特尔”
> echo "设置反汇编风格英特尔" > ~/.gdbinit
我正在编写一些C代码,以挂接加载到内存中的.so ELF(共享库)的某些功能。
我的C代码应该能够重定向另一个已加载到应用程序/程序的内存中的.so库的导出函数。
这里有一些阐述:

Android应用将加载多个.so文件。我的C代码必须浏览属于另一个共享.so库(在本例中称为target.so)的导出功能
这不是常规的dlsym方法,因为我不仅想要函数的地址,而且想用自己的功能替换它;这样做的方式是:当另一个库调用其自己的函数时,将改为调用我的hook_func,然后从我的hook_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,以分配此struct / object和函数返回。现在,只要我可以访问该AUDIO_SYSTEM对象,就可以轻松地向该对象附加一个回调并开始接收音频数据。因此,我的最终目标是获得对AUIOD_SYSTEM对象的引用。根据我的理解,只有在我第一次通过分配该对象的地方拦截该调用时,我才能得到该信息Audio_System_Create(AUIOD_SYSTEM **)。当前没有直接的方法来在android上获取输出音频。(所有示例都谈到仅录制来自麦克风的音频)
Update2: 正如Basile在他的回答中所建议的那样,我使用了dladdr(),但奇怪的是它给了我与传递给它相同的地址。
void *pFunc=procedure_addr; //procedure address calculated from the st_value of symbol from symbol table in ELF file (not from loaded file)
int nRet;
// Lookup the name of the function given the function pointer
if ((nRet = dladdr(pFunc, &DlInfo)) != 0)
{
LOGE("Symbol …Run Code Online (Sandbox Code Playgroud) 我常常听说使用符号表可以优化编程语言中的符号查找.目前,我的语言仅作为解释器实现,而不是作为编译器实现.我还不想分配时间来构建编译器,所以我试图优化解释器.该语言大部分基于Scheme语义和语法,并且是静态范围的.我使用AST在运行时执行代码(在我的解释器中,实现为有区别的联合,就像在AST中一样)Write Yourself a Scheme in 48 Hours.
不幸的是,由于使用F#Map按名称包含和查找符号,因此我的解释器中的符号查找速度很慢.(嗯,实际上,它使用的是Trie,但性能同样存在问题).我想改为使用符号树来实现更快的符号查找.但是,我不知道是否或如何在解释器中实现符号表.我只在编译器的上下文中听到它们.
这可能吗?如果实现策略或性能与编译器中的符号表不同,您能描述一下这些差异吗?最后,在我可能会看到的解释器中是否存在符号树的现有参考实现?
谢谢!
我知道我们可以通过读取符号表来获取elf中用户定义函数的开始地址,如下所示,函数main和foo:
08048330 T _start
0804a014 b completed.6159
0804a00c W data_start
0804a018 b dtor_idx.6161
080483e4 T foo
080483c0 t frame_dummy
080483ee T main
Run Code Online (Sandbox Code Playgroud)
但如何获得某些功能的结束地址?
谁能给我一些帮助?谢谢!
我正在研究编译器,我突然感到好奇的是,如果我用-g选项编译一个程序(比如说test.c),是否会创建一个带有符号表的实际文件并将其存储在某处或者它只是与可执行文件?
我是全新的,所以我真的在学习基础知识,对你们中的一些人来说可能听起来很愚蠢......对不起,请告诉我!
谢谢!