我正在研究STM32处理器.使用readelf -w,可以从我的elf文件中提取大量的调试信息.输出的一小部分如下所示:
<1><3faf>: Abbrev Number: 30 (DW_TAG_variable)
<3fb0> DW_AT_name : (indirect string, offset: 0x24e): ITM_RxBuffer
<3fb4> DW_AT_decl_file : 19
<3fb5> DW_AT_decl_line : 1742
<3fb7> DW_AT_type : <0x3f48>
<3fbb> DW_AT_external : 1
<3fbc> DW_AT_declaration : 1
Run Code Online (Sandbox Code Playgroud)
dwarfdump还确认调试信息在elf文件中可用.
我使用以下软件包:Eclipse Juno arm-2011.03/bin/arm-none-eabi-gdb OpenOCD和JTAG密钥
生成elf文件后,将其刻录到STM32处理器中,然后在Eclipse中启动调试会话.JTAG可以启动和停止,所以我猜OpenOCD deamon很好.由于"未加载符号表"这一事实,无法设置断点.一两件事我注意到的是其中"可变/ breakponts /注册/模块"窗口,显示加载的elf文件的模块选项卡包含followiing细节:类型:可执行符号:未加载符号文件:BuildResult.elf
在调试配置 - >启动选项卡中,选中/取消选中"加载图像/加载符号"没有区别.我想知道eclipse如何将elf文件包含符号信息加载到调试过程中?
任何建议,提示,非常感谢.
我有一个使用mmap系统调用的程序:
map_start = mmap(0, fd_stat.st_size, PROT_READ | PROT_WRITE , MAP_SHARED, fd, 0)
Run Code Online (Sandbox Code Playgroud)
和一个标题变量:
header = (Elf32_Ehdr *) map_start;
Run Code Online (Sandbox Code Playgroud)
如何访问符号表并使用标头变量打印其整个内容?
我一直在搜索有关C++代码的符号表是否包含函数名称和类名的各种帖子.我可以在帖子上找到的东西是它取决于编译器的类型,
如果它在一次通过中编译代码,则它不需要在符号表中存储类名和子程序名
但如果它是一个多遍编译器,它可以添加有关它遇到的类及其子例程的信息,以便它可以进行参数类型检查并发出有意义的错误消息.
我无法理解它是否真的依赖于编译器?我假设编译器(对于C++代码)会在表中放置带有类名的函数名,无论它是单通道还是多通道编译器.它如何依赖传球?我没有这么棒的知识.此外,任何人都可以显示一个简单的C++类的示例符号表,它会是什么样的(带有类名的函数名)?
我有一些关于 AST/符号表关系的事情我不明白。
我目前有一个在 C# 中实现的 AST,它具有用于变量声明的节点(这些包含有关名称、类型、源位置、可能的常量值作为表达式节点等的信息)。
现在我想填充一个符号表(在我的 AST 上使用访问者模式)但我的问题是:“符号”是新类,例如 VariableSymbol 还是符号表直接存储来自 AST 的 VariableDeclarationNode?
如果符号是新类,那么谁来存储常量变量、VariableDeclarationNode 或 VariableSymbol 或其他地方的计算表达式值?
(我看过一些解释器示例,它们将所有变量值(包括常量)存储在一个附加的哈希表中,但我正在研究源到源编译器而不是解释器,所以我不确定您将评估的常量存储在何处这种情况。对不起,我知道这些问题有点多)
c# compiler-construction compilation abstract-syntax-tree symbol-table
我在这里找到了在 Perl 中重命名匿名订阅者的解决方案。它涉及临时修改符号表以插入所需的名称。此解决方案使用要替换的硬编码符号表名称。我的问题是我想在运行时动态选择符号表名称。像这样的东西:
$pkg = 'MyPkg::ModA::';
$name = 'subname';
...
no strict 'refs';
local *{"${pkg}__ANON__"} = "$name [anon]";
strict refs;
Run Code Online (Sandbox Code Playgroud)
使其工作的唯一方法是禁用严格引用。如果它们未被禁用,脚本将失败并显示以下消息:
不能使用字符串 ("MyPkg::ModA::__ANON__") 作为符号引用,而在 /path/to/source/File.pm 行 xx 处使用“严格引用”
请注意,可以使用等效语句
local ${$pkg}{__ANON__} = "$name [anon]";
Run Code Online (Sandbox Code Playgroud)
带有类似的错误消息:
不能使用字符串 ("MyPkg::ModA::") 作为 HASH 引用,而在 /path/to/source/File.pm 行 xx 处使用“严格引用”
是否可以在不禁用严格引用的情况下做同样的事情?
TMI/DNR:
如果您感兴趣,这里有一个完整的示例。具有讽刺意味的是,我的解决方案使用匿名子重命名给定的匿名子。
ModA.pm
package MyPkg::ModA;
use strict;
use warnings;
use MyPkg::Util;
# Create a new instance.
sub new
{
my ($type, $class, $self);
# allow for both ModA::new and $moda->new
$type = shift; …Run Code Online (Sandbox Code Playgroud) 我有一个可执行文件,我正在使用gdb进行调试.这是我第一次使用gdb,请耐心等待.
我想在函数中设置断点,我知道使用类转储的函数的名称.现在它不会让我为该函数添加断点,因为它说没有符号表.我尝试添加符号表但它仍然抱怨没有加载符号表.
那么,无论如何我可以在这种方法中设置一个断点吗?这是一个客观的c方法,而不是c(如果这有所不同).我需要做的就是检查这个方法的论点.
我目前正在开发一种执行模式匹配的静态分析工具.我正在使用Flex生成词法分析器,我编写了代码来管理符号表.我对C不太熟悉,所以我决定将符号表实现为线性链表.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct symtab {
int id;
char *name;
int type;
struct symtab *next;
};
enum types {
KEYWORD = 1,
CONSTANT,
IDENTIFIER,
OPERATOR,
DELIMITER,
WHITESPACE
};
struct symtab *last_entry(struct symtab *start)
{
struct symtab *p;
p = start;
while(p -> next != NULL) {
p = p -> next;
}
return p;
}
void add_entry(char* name, int type, struct symtab *start)
{
struct symtab *new;
new = last_entry(start);
int id; …Run Code Online (Sandbox Code Playgroud) 测试平台为32位Linux。
我编译ac程序时没有去除符号信息,并使用objdump反汇编elf可执行文件。
这是结果的一部分。
804831c: e8 8c fe ff ff call 8048360 <printf@plt>
Run Code Online (Sandbox Code Playgroud)
如果我使用:
strip binary
Run Code Online (Sandbox Code Playgroud)
删除符号信息并使用 objdump 再次反汇编 elf 可执行文件,我仍然可以看到如下结果:
804831c: e8 8c fe ff ff call 8048360 <printf@plt>
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
在我剥离了所有符号信息后,像 objdump 这样的反汇编工具如何知道某些库函数的名称?
谢谢你!
我有一个想要检查的应用程序,但没有源代码来重建它并创建符号表,如下所示( ) gcc -g my_app.c。
当我调用时,info locals出现以下错误“没有可用的符号表信息”
当我使用 Eclipse 时,即使我没有库的源代码,它也可以将当前函数的参数解析为arg0、arg1...argN,如果我没记错的话,还可以解析对象的成员。
有没有办法生成一个自定义/通用/默认符号表,满足 GDB 的要求并允许我查看局部变量和参数的值?
手册页有这样的内容:
st_info This member specifies the symbol's type and binding
attributes:
STT_NOTYPE The symbol's type is not defined.
STT_OBJECT The symbol is associated with a data object.
STT_FUNC The symbol is associated with a function or other
executable code.
STT_SECTION The symbol is associated with a section. Symbol
table entries of this type exist primarily for
relocation and normally have STB_LOCAL bindings.
STT_FILE By convention, the symbol's name gives the name
of the source file associated with the …Run Code Online (Sandbox Code Playgroud)