标签: symbol-table

符号表:删除条目

删除相应的符号表条目后,为什么要从"$ n"和"$ m"中获取值?

#!/usr/bin/env perl
use warnings;
use 5.012;

package Foo;

our $n = 10;
our $m = 20;

delete $Foo::{'n'};
delete $Foo::{'m'};

say $n; # 10
say $m; # 20
Run Code Online (Sandbox Code Playgroud)

perl symbol-table

8
推荐指数
1
解决办法
644
查看次数

目标文件中的符号表和重定位表

据我所知,目标文件中的指令和数据都有地址.第一个数据项从地址0开始,第一个指令也从地址0开始.

重定位表包含有关在文件中的地址更改时需要更新的指令的信息,例如,如果文件与另一个文件链接在一起.在下面的示例中,行A将位于重定位表中.我不认为B会在重定位表中,因为标签"相等"的地址是相对于B.这些正确的假设是什么?

我知道符号表显示文件的标签以及尚未解析的标签.但是符号表包含哪些其他信息?

此外,当汇编程序将指令转换为二进制时,那些具有未解析引用的指令中放置了什么?B在这个例子中.

.data
TEXT: .asciiz "Foo"

.text
.global main
main:
     li t0, 1
     beq t0, 1, equal #B

equal:
    la a0, TEXT
    jal printf #A
Run Code Online (Sandbox Code Playgroud)

assembly compilation object-files symbol-table

8
推荐指数
1
解决办法
1万
查看次数

本地词典何时设置?

模块保存字典以跟踪其上下文,例如在执行的某个点定义的名称.这本词典可以通过访问vars(module)(或module.__dict__)如果module是进口,或者通过向呼叫locals模块本身的内置功能:

更新并返回表示当前本地符号表的字典.

但是当我尝试从函数中访问locals字典时,我发现自己有点困惑.仅包含以下内容的脚本的输出是空字典:

def list_locals():
    print(locals())

list_locals()
Run Code Online (Sandbox Code Playgroud)

但另一方面,如果脚本仅包含以下内容,则输出是包含的预期字典__name__,__doc__以及其他模块级变量:

print(locals())
Run Code Online (Sandbox Code Playgroud)

那么,本地词典的内容何时设置?另外,"更新"在locals函数定义中意味着什么?

python namespaces symbol-table

8
推荐指数
1
解决办法
177
查看次数

如何制作符号表

我们有一个编译器的作业.我们已经进行了词法和语法分析,但我们仍然坚持生成中间代码.我们意识到我们必须实现一个符号表,以便进行中间代码生成,我们不知道,如何做以及它包含什么.

鉴于下面的代码,符号表应包含什么?(代码用教育语言编写,如下所述)

另外我们如何在符号表中实现范围?

<PROGRAM> ::= PROGRAM ID <BLOCK> ENDPROGRAM
<BLOCK> ::= {<DECLARATIONS> <SUBPROGRAMS> <SEQUENCE>}
<DECLARATIONS> ::= ? | DECLARE <VARLIST> ENDDECLARE
<VARLIST> ::= ? | ID ( , ID )*
<SUBPROGRAMS> ::= ( <PROCORFUNC> ) *
<PROCORFUNC> ::= PROCEDURE ID <PROCORFUNCBODY> ENDPROCEDURE |
FUNCTION ID <PROCORFUNCBODY> ENDFUNCTION
<PROCORFUNCBODY> ::= <FORMALPARS> <BLOCK>
<FORMALPARS> ::= ? | ( <FORMALPARLIST> )
<FORMALPARLIST> ::= <FORMALPARITEM> ( , <FORMALPARITEM> )*
<FORMALPARITEM> ::= IN ID | INOUT ID
<SEQUENCE> ::= <STATEMENT> ( ; <STATEMENT> )*
<STATEMENT> …
Run Code Online (Sandbox Code Playgroud)

java compiler-construction symbol-table

7
推荐指数
1
解决办法
7334
查看次数

什么是Java方法的内部标识?

众所周知,在Java中,方法名称不足以区分不同的方法.

我认为(可能是错的),要区分方法,需要以下信息:

(className, methodName, methodParameters)
Run Code Online (Sandbox Code Playgroud)

进一步,

  • 如何在内部更有效地识别方法?
  • 我听说过"方法ID".这是否意味着上面的三元组和一个整数之间存在映射,因此JVM在解析后只使用方法ID?
  • 如果是这样,它是否位于符号表中?

谢谢!

java methods function symbol-tables symbol-table

6
推荐指数
1
解决办法
2127
查看次数

(.eh)在nm输出中的含义是什么?

当我查看我的库中的符号时nm mylib.a,我看到一些重复的条目,如下所示:

000000000002d130 S __ZN7quadmat11SpAddLeavesC1EPNS_14BlockContainerEPy
00000000000628a8 S __ZN7quadmat11SpAddLeavesC1EPNS_14BlockContainerEPy.eh
Run Code Online (Sandbox Code Playgroud)

通过管道输送c++filt:

000000000002d130 S quadmat::SpAddLeaves::SpAddLeaves(quadmat::BlockContainer*, unsigned long long*)
00000000000628a8 S quadmat::SpAddLeaves::SpAddLeaves(quadmat::BlockContainer*, unsigned long long*) (.eh)
Run Code Online (Sandbox Code Playgroud)

.eh意味着什么,这个额外符号用于什么?

我发现它与异常处理有关.但为什么这会使用额外的符号?

(我用clang注意到这一点)

c++ symbol-table nm

6
推荐指数
1
解决办法
625
查看次数

是否可以确定符号是否是C中的变量或函数?

我正在为在Linux机器上运行的C编写的应用程序实现一些有限的远程调试功能.目标是与应用程序通信并查找任意变量的值或运行任意函数.

我能够通过dlsym()调用查找符号,但我无法确定返回的地址是指函数还是变量.有没有办法通过此符号表确定输入信息?

c linux symbol-tables symbol-table

6
推荐指数
1
解决办法
373
查看次数

使用GDB调试无法查找D编程符号

我已经在我的Ubuntu 13.10 x86_64上使用其默认编译器GCC 4.8.1在github上成功构建并安装了Ian Buclaw(ibuclaw)GDB分支.

我不得不ldbin子目录中删除该文件,否则DMD会抱怨链接阶段的sysroot事情.

当我编译我的测试程序并通过GDB运行时,我遇到了问题.

我可以做break main,运行和GDB在开始main时停止,但是当我这样做时,next我得到以下不希望的输出

  Single stepping until exit from function main,
  which has no line number information.
  0x00007ffff760ede5 in __libc_start_main () from 
  /lib/x86_64-linux-gnu/libc.so.6
Run Code Online (Sandbox Code Playgroud)

是不是ibuclaw的GDB应该在这里工作?

我的测试程序编译为

dmd -debug -g -gs -wi t_array.d -oft_array
Run Code Online (Sandbox Code Playgroud)

没有任何警告也没有错误.我也试图假装成C

dmd -debug -g -gc -gs -wi t_array.d -oft_array
Run Code Online (Sandbox Code Playgroud)

结果相同.

此外,当我执行btab时,完成列表中的大多数符号都不会被解码.

我的测试程序看起来像

import std.stdio, std.algorithm;

void main(string args[]) {
    int[] x;
    writeln(x.sizeof);

    if (x) {
        writeln("Here!");
    } else {
        writeln("There!"); …
Run Code Online (Sandbox Code Playgroud)

debugging gdb d symbol-table

6
推荐指数
1
解决办法
716
查看次数

通过子名称获取符号的值

我正在创建一个包,我必须通过它在sub中的名称来获取符号的值,而符号在sub之外定义.

这是简化的代码,它按预期工作:

#! /usr/bin/env perl6 

sub dump_value($symbol) {
    say ::("$symbol")
}

# usage:
my $x = 10;
dump_value('$x');

# expected output: 10
# actual output: 10
Run Code Online (Sandbox Code Playgroud)

然后我将'dump_value'放在一个独立的文件中,如下所示:

# somelib.pm6
unit module somelib;

sub dump_value($symbol) is export {
    say ::("$symbol")
}
Run Code Online (Sandbox Code Playgroud)
# client.pl6
#! /usr/bin/env perl6

use lib ".";
use somelib;

my $x = 10;

dump_value('$x');
Run Code Online (Sandbox Code Playgroud)

编译抱怨:

No such symbol '$x'
  in sub dump_value at xxx/somelib.pm6 (somelib) line 3
  in block <unit> at ./client.pl6 line 8
Run Code Online (Sandbox Code Playgroud)

以下是一些实验.他们都没有成功.

say ::("MY::$symbol")

say ::("OUR::$symbol") …
Run Code Online (Sandbox Code Playgroud)

scope string-interpolation perl6 symbol-table raku

6
推荐指数
1
解决办法
106
查看次数

gdb没有为核心文件加载符号表

客户端为我的应用程序生成了一个核心转储,在查看回溯时我没有加载符号......

(gdb) where
#0  0x000000364c032885 in ?? ()
#1  0x000000364c034065 in ?? ()
#2  0x0000000000000000 in ?? ()
(gdb) bt full
#0  0x000000364c032885 in ?? ()
No symbol table info available.
#1  0x000000364c034065 in ?? ()
No symbol table info available.
#2  0x0000000000000000 in ?? ()
No symbol table info available.
Run Code Online (Sandbox Code Playgroud)

我想在这里提一下,正在使用的应用程序是使用-g选项构建的.

对我来说似乎没有加载所需的库.我尝试使用"符号文件"手动加载库,但这没有帮助.

可能的问题是什么?

gdb symbol-table

5
推荐指数
1
解决办法
2万
查看次数