- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 Eclipse 和 Yagarto 工具链(非 eabi,GCC 4.7.1)对 ARM 7 芯片(Atmel 的 AT91SAM7X256)进行编程,该项目的目标是将引导加载程序放置在 ROM 的定义范围内,稍后将其复制到 RAM(见下图,应用程序代码启动的 ROM 地址 0x104000 是固定的)。按预期工作...直到您调试程序(SEGGER J-Link 和 GDB)。
此处显示内存结构图像:http://i47.tinypic.com/2vb6f7o.jpg (抱歉,无法在此处发布图片)。
问题是从链接的.text段开始的,主要是下面的方法,它启动了整个.text段(正确):(通过 objdump -e -h common/exhandler.o > exhandler.lst 反汇编的 C 代码)
00000000 <EXHANDLER_printHex>:
0: e92d4038 push {r3, r4, r5, lr}
4: e1a05000 mov r5, r0
8: e3a0401c mov r4, #28
c: e1a03435 lsr r3, r5, r4
10: e203000f and r0, r3, #15
14: e3500009 cmp r0, #9
18: c2800027 addgt r0, r0, #39 ; 0x27
1c: e2800030 add r0, r0, #48 ; 0x30
20: ebfffffe bl 0 <DBGUNIT_sendCharacter>
24: e2444004 sub r4, r4, #4
28: e3740004 cmn r4, #4
2c: 1afffff6 bne c <EXHANDLER_printHex+0xc>
30: e8bd4038 pop {r3, r4, r5, lr}
34: e12fff1e bx lr
反汇编链接的ELF文件时,代码输出为:(错误)
00104000 <EXHANDLER_printHex>:
104000: e92d4038 push {r3, r4, r5, lr}
104004: 5000 str r0, [r0, r0]
104006: 401ce1a0 andsmi lr, ip, r0, lsr #3
10400a: e3a0 b.n 10474e <ADCDAC_get16BitChannel+0x82>
10400c: e1a03435 .word 0xe1a03435
104010: e203000f and r0, r3, #15
104014: e3500009 cmp r0, #9
104018: 0027 movs r7, r4
10401a: 0030c280 eorseq ip, r0, r0, lsl #5
10401e: e280 b.n 104522 <CSTARTUP_lowLevelInit+0xfa>
104020: eb003367 bl 110dc4 <__DBGUNIT_sendCharacter_from_arm>
104024: 4004 ands r4, r0
104026: e244 .short 0xe244
104028: e3740004 cmn r4, #4
10402c: 1afffff6 .word 0x1afffff6
104030: e8bd4038 pop {r3, r4, r5, lr}
104034: e12fff1e .word 0xe12fff1e
虽然字节序列保持不变,但这些 ASM 命令的解释有所不同。我的假设是 Thumb 和 ARM 代码在链接过程中出了点问题。
我的链接器文件:
/*
* Linker script for AT91SAM7X256 with internal bootloader.
*
* Bootloader is put into first 16 kB of Flash, then loaded to RAM and will connect by DBGU UART interface
* (115 kBaud, no parity bit).
*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)
MEMORY
{
flash-boot (rx) : ORIGIN = 0x00100000, LENGTH = 16K /* read-only flash memory for boot-loader and startup sequence */
flash-app (rx) : ORIGIN = 0x00104000, LENGTH = 240K /* read-only flash memory for application */
ram (rwx) : ORIGIN = 0x00200000, LENGTH = 64K /* read/write S-RAM memory */
}
/* Stack is growing backwards, starting at end of RAM and is aligned at 4 byte. First entry in stack will
use RAM address 0x20fffc to 0x20ffff. */
_estack = 0x20fffc;
SECTIONS
{
. = 0;
/* Elements required during start-up sequence. Must be first elements in ROM. */
.startup : {
obj/sys/startup.o(.text .rodata)
. = ALIGN(4);
obj/sys/swi_handler.o(.text .rodata)
. = ALIGN(4);
_estartup = .; /* end of startup segment */
} >flash-boot
.ramvect : { /* used for vectors remapped to RAM */
__ram_start = .;
. = 0x40;
} >ram
/* Further elements for bootloader, which are placed into RAM for allowing chip flash. */
.bootloader : {
_bootloader = .; /* RAM */
obj/comm/dbgunit.o(.text .rodata)
. = ALIGN(4);
_ebootloader = .; /* RAM */
} >ram AT>flash-boot
/* Code starts at fixed address in flash (application start) and is kept there. */
.text : {
CREATE_OBJECT_SYMBOLS
*(.text .text.* .gnu.linkonce.t.*) /* remaining code */
*(.plt)
*(.gnu.warning)
*(.glue_7) *(.glue_7t) /* stub for code which glues together ARM7 and Thumb code */
. = ALIGN(4);
*(.rodata .rodata.* .gnu.linkonce.r.*) /* read-only data (constants) */
*(.ARM.extab* .gnu.linkonce.armextab.*)
*(.gcc_except_table)
*(.init)
*(.fini)
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
} >flash-app
/* .ARM.exidx is sorted, so has to go in its own output section. */
.ARM.exidx : {
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
} >flash-app
_etext = .;
/* Initialized .data sections go into RAM. */
.data :
{
_data = .; /* create a global symbol marking the start of the .data section (RAM) */
*(.ramsection .ramsection.*)
. = ALIGN(4);
*(.data .data.* .gnu.linkonce.d.*)
. = ALIGN(4);
_edata = .; /* define a global symbol marking the end of the .data section */
} >ram AT>flash-app /* put all the above into RAM */
/* Uninitialized .bss sections go into RAM. */
.bss (NOLOAD):
{
__bss_start__ = .; /* define a global symbol marking the start of the .bss section */
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(4);
} > ram /* put all the above in RAM (it will be cleared in the startup code */
_bss_end = . ;
__bss_end__ = . ; /* define a global symbol marking the end of the .bss section */
. = ALIGN(4); /* advance location counter to the next 32-bit boundary */
_end = .; /* define a global symbol marking the end of application RAM */
PROVIDE (end = .);
/* DWARF debug sections.
* Symbols in the DWARF debugging sections are relative to the beginning
* of the section so we begin them at 0.
*/
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.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) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }
/DISCARD/ : { *(.note.GNU-stack) }
}
谁能发现链接器文件中的错误或给我提示,下一步该看哪里?
感谢阅读,保尔
PS:这是 ELF 文件节标题的一些输出,因此很明显没有重叠节。
Sections:
Idx Name Size VMA LMA File off Algn
0 .startup 0000033c 00100000 00100000 00008000 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .ramvect 00000040 00200000 00200000 00030000 2**0
ALLOC
2 .bootloader 000001cc 00200040 0010033c 00010040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
3 .text 0000ce08 00104000 00104000 00014000 2**3
CONTENTS, ALLOC, LOAD, READONLY, CODE
4 .ARM.exidx 000000f0 00110e08 00110e08 00020e08 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .data 0000129c 00200210 00110ef8 00028210 2**3
CONTENTS, ALLOC, LOAD, DATA
6 .bss 000008c8 002014ac 00112194 000294ac 2**2
ALLOC
7 .debug_aranges 000009b8 00000000 00000000 000294b0 2**3
CONTENTS, READONLY, DEBUGGING
8 .debug_info 0002166d 00000000 00000000 00029e68 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_abbrev 00006cb4 00000000 00000000 0004b4d5 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_line 00007db7 00000000 00000000 00052189 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_frame 0000232c 00000000 00000000 00059f40 2**2
CONTENTS, READONLY, DEBUGGING
12 .debug_str 0000682a 00000000 00000000 0005c26c 2**0
CONTENTS, READONLY, DEBUGGING
13 .debug_loc 00016421 00000000 00000000 00062a96 2**0
CONTENTS, READONLY, DEBUGGING
14 .comment 00000011 00000000 00000000 00078eb7 2**0
CONTENTS, READONLY
15 .ARM.attributes 0000002e 00000000 00000000 00078ec8 2**0
CONTENTS, READONLY
16 .debug_ranges 00000968 00000000 00000000 00078ef6 2**0
CONTENTS, READONLY, DEBUGGING
最佳答案
看来,错误的反汇编代码是反汇编程序的问题,无法区分混合目标文件中的ARM
和Thumb
编译代码。
EXHANDLER_printHex()
方法已在 ARM
模式下编译,但被错误地解密为 Thumb
代码。
结论:DisASM
的代码没有解决问题。
关于c - AT91SAM7x : DisASM chaos probably caused by linker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141082/
我正在尝试使用一个使用 JNI 的库。 我已经尝试了开发人员提供的示例应用程序,它可以工作。所以我知道这不是库中的错误。 我认为我在导入库的过程中做错了什么: 将 .so 文件复制到我的 libs 文
使用Websphere 应用程序服务器 + Wicket 1.6我的挂载 URL 遇到一些问题。 当我调用类似于以下内容的网址时:localhost:9080/danesCooking/pies/me
我有一个应用程序在 Win2k3 VM 上的 Apache Tomcat 5.5 上运行。该应用程序提供 XML,供某些电话设备使用,作为我们 IVR 基础设施的一部分。反过来,应用程序从一些 SOA
升级到雅加达给我带来了一些问题。。我正在使用以下maven插件:。并且我使用episodal编译(有库)。突然间,我面临着以下问题:。更仔细的检查发现,XJC突然生成了以下字段:。这是它以前没有产生的
Jenkins 有一个可用于自由式构建作业的 $CAUSE 变量。 如何在工作流程中访问此内容或类似内容? 我的团队在现有临时构建的电子邮件输出中使用它。我们希望在新的基于工作流的工作中继续这样做。
错误:无法完成 Gradle 执行。 原因: Could not create parent directory for lock file C:\Program Files\Android\Andr
如何确定多个浏览器 UI 事件是否由相同的基本 UI 交互引起? 例如,用户单击和事件监听器会触发“blur”和“mousedown”事件。有没有办法确定这两个事件都是由一次用户点击引起的? 最佳答案
它可以编译,但不会从 .o 文件链接到可执行文件。我已经删除了从现在到运行良好时所做的所有更改(基本上,str_to_int 中的所有内容)。 我的代码: #include #include in
关于 Java 的 InterruptedException 有一些有趣的问题和答案。 ,例如 The Cause of InterruptedException和 Handling Interrup
我使用 android 工具 “内存监视器” 来修复内存泄漏。这很有帮助。 但是,我需要澄清一下。 有时在运行该应用程序后,分配的内存为“47MB”。当与应用交互时,它会上下移动。 然后当我点击“ca
我正在调查由于堆损坏而导致的崩溃。由于这个问题很重要并且涉及分析堆栈和转储结果,因此我决定对与崩溃相关的文件进行代码审查。 坦率地说,我对堆何时可能损坏没有深入的了解。 如果您能提出可能导致堆损坏的方
假设我们有一个名为 feature-branch 的功能分支。该分支的开发人员分支获取他们的票,然后打开一个 PR 到 feature-brach。 如果发生以下情况: 开发人员A从feature-b
两个线程同时访问fileName。 Set If 0 使死锁。但如果 1 一切顺利。 那么是什么导致了这种情况? 最佳答案 确保您没有在主线程上同步调用 +[PHAssetResource asset
不幸的是,我还不是正则表达式专家,因此遇到了以下问题:假设我有一个包含多个链式异常的 Java 堆栈跟踪,我想要达到的是提取以“Caused by”开头的最后一行。 javax.servlet.Ser
我确信这是我所缺少的非常简单的东西。我使用 makeKeyAndOrderFront: 打开一个窗口,它第一次工作。当我关闭窗口并尝试再次打开它时,它退出并给出错误EXC_BAD_ACCESS。我的代
我刚刚探索了 Rank2Types 和 RankNTypes,试图熟悉它们。但我不明白为什么以下不起作用。 g :: (forall a. forall b. a -> b) -> x -> y ->
我想验证输入是否严格是由 10-16 个字符长组成的数字。根据用户输入值,我将在输入字段下方显示一条消息。问题是,当我去使用时为了帮助完成此任务,它会导致应用程序抛出异常。 我是 JSF 新手,我很难
许多内置的 Java 异常无法接受“原因”。有什么方法可以为这些异常指定原因吗? 我希望能够链接异常,就像这个 InterruptedException 示例一样: try{ //thread
我创建了一个 JSP Mysql 和 Bootstrap Crud 应用程序。当我单击“更新”按钮时,将调用函数 validation() 来更新所有字段,在成功更新后,它将重定向到另一个 JSP 页
我看到了奇怪的情况:在我的 Android 应用程序代码中使用类似这样的东西时我没有收到任何错误: @Override public void onBackPressed() { if
我是一名优秀的程序员,十分优秀!