- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
背景
我有一个使用 C 代码和 C++ 代码的项目。链接不是问题:C 函数由 C++ 代码正确调用。
我所有的 .cpp
文件都是用 -g3
编译的,但只有 main.c
和 pyexec.c
是-g3
;其余没有调试信息。
链接步骤包括链接一些 .cpp
文件、.cpp
对象和包含 .c
对象的文件。
问题
当我在我的 .elf
上执行 objdump
时
objdump APP.elf -dSsxsgetr > elf.dump
我看到 .cpp
文件的源代码散布在程序集中,但没有看到用 -g3
编译的两个 .c
文件的源代码。
仔细检查
我绝对确定我用 -g3
编译了 main.c
和 pyexec.c
。当我做了 objdump -dSsxsgetr
main.obj
,除了包含我的 .c
文件。
我的链接命令是:
arm-none-eabi-ld.exe HW_Interface.obj HW_Module.obj HeapMngr.obj C_archive.a Cpp_archive.a -nostartfiles --no-warn-mismatch --gc-sections --stats --cref -Map=APP.map -T "APP.ld"-o "APP.elf"
问题
为什么使用 -g3
编译的 .c
对象的调试行号没有进入 .elf
?
更新 1
我认为剥离符号的是我的链接器脚本语句与链接器的 --gc-sections
选项相结合:
.dflash_code :
{
*ATI_micropython.dlb:*(.text.*)
*ATI_micropython.dlb:*(.debug*)
} >dflash
这个陈述是“正确的”,但正在发生的事情(我认为)是因为我没有明确指定任何包含逐行信息的输入部分 and 因为 - -gc-sections
说丢弃任何“未使用的”部分,该信息正在被删除。
所以真正的问题是:我需要添加到包含混合源程序集的 .dflash_code
的输入部分是什么? .debug_line
部分已包含在内,其中包含给定文件的完整源代码。
在 .map
中,有一个名为 Discarded input sections
的部分。在本节中,我看到只有我的两个 .c
调试文件有一堆 .debug_macro
语句。 . .这没有意义,因为 *ATI_micropython.dlb:*(.debug*)
应该包含所有这些部分(除非我误解了它们的目的)。
.debug_macro 0x00000000 0x3a ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x35 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x3a ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x52 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x19 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x189 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x10 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x22 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x91 ..\archive.dlb(main.doj)
最佳答案
终于找到了原因,但我还是不明白为什么会发生这种情况:
在链接器文件中,如果我将名称中带有 .debug
的所有部分(如 .debug_macro
放在不同的部分中):
.dflash_code :
{
*archive.dlb:*(.text.*)
*archive.dlb:*(.debug*)
} >dflash
然后在 ELF .map
文件中,我将把那些部分放在 .elf
中(没有废话),包括 .debug_line
,其中,在 .obj
中,包含相应 .c
的完整源代码:
app.elf.map:
.debug_line 0x1001841d 0x87e ..\archive.dlb(main.doj)
.debug_line 0x10026152 0x8fe ..\archive.dlb(pyexec.doj)
但是,如果我运行 objdump -Sxg app.elf
,我不会将源代码与程序集混在一起:
Disassembly of section .dflash_code:
10000000 <micropython_main>:
10000000: b580 push {r7, lr}
10000002: b084 sub sp, #16
10000004: af00 add r7, sp, #0
10000006: 6078 str r0, [r7, #4]
10000008: 6039 str r1, [r7, #0]
1000000a: 4b09 ldr r3, [pc, #36] ; (10000030 <micropython_main+0x30>)
1000000c: f107 020c add.w r2, r7, #12
10000010: 601a str r2, [r3, #0]
10000012: f001 ff6d bl 10001ef0 <mp_init>
10000016: 4807 ldr r0, [pc, #28] ; (10000034 <micropython_main+0x34>)
10000018: f006 f88e bl 10006138 <pyexec_frozen_module>
1000001c: f001 ff94 bl 10001f48 <mp_deinit>
10000020: f04f 0300 mov.w r3, #0
10000024: 4618 mov r0, r3
10000026: f107 0710 add.w r7, r7, #16
1000002a: 46bd mov sp, r7
1000002c: bd80 pop {r7, pc}
1000002e: bf00 nop
10000030: 1fff34fc .word 0x1fff34fc
10000034: 100313bc .word 0x100313bc
但是,如果我更改链接器文件,使 archive.dlb
中的 .debug*
部分不放在 .dflash_code
中(我重申这是我所做的唯一更改):
.dflash_code :
{
*archive.dlb:*(.text.*)
} >dflash
然后在 ELF .map
文件中,我仍然看到那些相同的 .debug_line
部分,但是由于后面的一些其他语句,它们被放置在不同的位置链接器文件
app.elf.map:
.debug_line 0x00082a32 0x87e ..\archive.dlb(main.doj)
.debug_line 0x000832b0 0x8fe ..\archive.dlb(pyexec.doj)
最重要的是,运行 objdump -Sxg app.elf
会得到混合的源程序集
int micropython_main(char * uP_heap, unsigned int heap_size)
{
10000000: b580 push {r7, lr}
10000002: b084 sub sp, #16
10000004: af00 add r7, sp, #0
10000006: 6078 str r0, [r7, #4]
10000008: 6039 str r1, [r7, #0]
int stack_dummy;
stack_top = (char*)&stack_dummy;
1000000a: 4b09 ldr r3, [pc, #36] ; (10000030 <micropython_main+0x30>)
1000000c: f107 020c add.w r2, r7, #12
10000010: 601a str r2, [r3, #0]
#if MICROPY_ENABLE_GC
gc_init(uP_heap, uP_heap + heap_size);
#endif
mp_init();
10000012: f001 ff6d bl 10001ef0 <mp_init>
pyexec_frozen_module("main.py");
10000016: 4807 ldr r0, [pc, #28] ; (10000034 <micropython_main+0x34>)
10000018: f006 f88e bl 10006138 <pyexec_frozen_module>
mp_deinit();
1000001c: f001 ff94 bl 10001f48 <mp_deinit>
return 0;
10000020: f04f 0300 mov.w r3, #0
}
10000024: 4618 mov r0, r3
10000026: f107 0710 add.w r7, r7, #16
1000002a: 46bd mov sp, r7
1000002c: bd80 pop {r7, pc}
1000002e: bf00 nop
10000030: 1fff34fc .word 0x1fff34fc
10000034: 1001eaf4 .word 0x1001eaf4
那么,为什么将 .debug*
部分放在哪里很重要?我不认为它在技术上确实如此。我的链接器文件中影响 DWARF 符号位置的部分如下所示:
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
我猜顺序在某种程度上很重要。
关于c++ - gcc 链接器 - .obj 转储具有混合源程序集,但在 .elf 中链接时没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47560152/
我已经在标准 WPF 控件中实现了一个报告,并且还实现了一个 DocumentPaginator获取这些控件并将它们转换为用于打印的文档。 我还实现了一些使用文档分页器将页面呈现为图像并使用 PDFS
在 C# 中,我有以下代码: public static string GetHashCode(string p) { var a = new SHA256Managed();
您好,我正在尝试在编码后将我的 mysqli 数据库输出到一个 js 文件,我用 json_encode 对其进行编码没有任何问题,但是如何将其放入 js 文件中(每次更新时更新) mysqli数据已
我需要将 select 从 JS 传递到 HTML。 select 应该包含来自 PHP 的 option。 所以,首先我有一个 HTML div,我将在其中添加来自 JS 的内容。
我有一个相当大且复杂的 SVG 代码,它根据页面信息使用 JavaScript 和 jQuery 动态生成。 然后我有一个 AJAX 帖子保存。 我无法将其转换为正确发布图像数据? var canva
我想将我的本地日期 ([NSDate date]) 转换为 GMT 以创建一个 JSON 字符串 (/Date(1324435876019-0000)/)。 当我将时钟设置为 EST 时区时,我的代码
1. 原始单据与实体之间的关系 可以是一对1、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章服务器五大相关基础知识【转】由作者收集整理,如果你对这篇文章有兴趣,记得
Google Apps 脚本 - Gmail 是否会实现 GmailMessage (GmailThread) .getAsPdf() 方法?预期输出与 Gmail 中可用的打印为 PDF 的输出相同
有一个需求是要在一个云监控的状态值中存储多个状态(包括可同时存在的各种异常、警告状态)使用了位运算机制在一个int型中存储。 现在监控日志数据量非常大(亿级别)需要对数据按每小时、每天进行聚合,供
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章1张图看懂RAID功能,6张图教会配置服务器【转】由作者收集整理,如果你
我正在使用 FFMPeg(版本 ffmpeg-20170330-ad7aff0-win64-static)将 RTSP 转换为 .m3u8。 命令是: ffmpeg -rtsp_transport t
我有一个 JTree使用 DefaultTreeModel 的对象作为模型,我添加/删除与该模型相关的节点。 此时,我需要在图形界面中显示树结构,例如 JPanel .如何映射 DefaultTree
我当前正在接收一个文件并将其存储到 NSString 中。然后,我从字符串中创建一个数组并将其呈现在 TableView 中。这在一定程度上有效。我目前收到的数据如下: 公司名称|帐户代码\r\n公司
我需要创建 NSImage cocoa 对象的 base64 字符串表示形式。处理这个问题的最佳方法是什么,苹果文档似乎在这个主题上有点短(或者我只是找不到它)。 Base64 编码从外面看起来相当复
JS 中的 .toISOString() 函数给我这样的字符串: 2015-06-14T20:00:00:000Z 我需要它是这样的: 2015-06-14T20:00:00Z JS 中是否有其他函数
我正在尝试使用 JavaScript 转换 COLORREF: COLORREF : When specifying an explicit RGB color, the COLORREF value
我在这里遇到了这个代码的问题,只是想制作一个小计算器: 打包申请; import javafx.event.ActionEvent; import javafx.scene.control.TextF
我想要做的是能够通过本地PC上的USS通过sshfs挂载主机上的一些文件。我可以做到这一点,但 sshfs 不能直接完成从 EBCDIC 到 ascii/unicode 的转换。有没有我可以设置的标志
我正在尝试在 python 中将一堆 Visio 文件转换为 pdf。我已经引用了这个.doc to pdf using python并编写了以下代码: import comtypes.client
我是一名优秀的程序员,十分优秀!