删除相应的符号表条目后,为什么要从"$ 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) 据我所知,目标文件中的指令和数据都有地址.第一个数据项从地址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) 模块保存字典以跟踪其上下文,例如在执行的某个点定义的名称.这本词典可以通过访问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函数定义中意味着什么?
我们有一个编译器的作业.我们已经进行了词法和语法分析,但我们仍然坚持生成中间代码.我们意识到我们必须实现一个符号表,以便进行中间代码生成,我们不知道,如何做以及它包含什么.
鉴于下面的代码,符号表应包含什么?(代码用教育语言编写,如下所述)
另外我们如何在符号表中实现范围?
Run Code Online (Sandbox Code Playgroud)<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> …
众所周知,在Java中,方法名称不足以区分不同的方法.
我认为(可能是错的),要区分方法,需要以下信息:
(className, methodName, methodParameters)
Run Code Online (Sandbox Code Playgroud)
进一步,
谢谢!
当我查看我的库中的符号时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注意到这一点)
我正在为在Linux机器上运行的C编写的应用程序实现一些有限的远程调试功能.目标是与应用程序通信并查找任意变量的值或运行任意函数.
我能够通过dlsym()调用查找符号,但我无法确定返回的地址是指函数还是变量.有没有办法通过此符号表确定输入信息?
我已经在我的Ubuntu 13.10 x86_64上使用其默认编译器GCC 4.8.1在github上成功构建并安装了Ian Buclaw(ibuclaw)GDB分支.
我不得不ld从bin子目录中删除该文件,否则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) 我正在创建一个包,我必须通过它在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) 客户端为我的应用程序生成了一个核心转储,在查看回溯时我没有加载符号......
(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选项构建的.
对我来说似乎没有加载所需的库.我尝试使用"符号文件"手动加载库,但这没有帮助.
可能的问题是什么?
symbol-table ×10
gdb ×2
java ×2
assembly ×1
c ×1
c++ ×1
compilation ×1
d ×1
debugging ×1
function ×1
linux ×1
methods ×1
namespaces ×1
nm ×1
object-files ×1
perl ×1
perl6 ×1
python ×1
raku ×1
scope ×1