- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图在我的 STM32 设备上使用一个特殊的 SRAM 部分,该部分位于地址 0x40006000
.我在 ST 的示例代码中看到的一种方法是简单地创建指针,其值恰好位于 RAM 的该部分内。我想要做的是让链接器为我管理该部分中的静态分配。
基本上,我会从这样的事情开始:
static uint16_t *buffer0 = ((uint16_t *)0x40006000);
static uint16_t *buffer1 = ((uint16_t *)0x40006080);
像这样的东西(我认为它远不易碎,也不像 hacky,虽然不便携):
#define _PMA __attribute__((section(".pma"), aligned(2)))
static uint16_t _PMA buffer0[64];
static uint16_t _PMA buffer1[64];
为了实现这一点,我修改了我的链接描述文件,在 0x40006000
处添加了一个名为“PMA”的新内存。我在其中找到了“.pma”部分,如下所示:
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
PMA (xrw) : ORIGIN = 0x40006000, LENGTH = 1024 /* This is the memory I added */
}
SECTIONS
{
.text
{
..blah blah blah..
} > FLASH
...more sections, like rodata and init_array..
/* Initialized data goes into RAM, load LMA copy after code */
.data
{
..blah blah blah with some linker symbols to denote the start and end..
} >RAM AT> FLASH
.bss
{
..blah blah blah..
} >RAM
.pma /* My new section! */
{
_pma_start = .;
. = ALIGN(2);
*(.pma)
*(.pma*)
} >PMA
}
所以这看起来一切都很好,花花公子,我的东西编译并且 map 向我显示 buffer0
和 buffer1
确实位于 0x40006000
和 0x40006080
.这是我的 makefile 最后一点的输出:
arm-none-eabi-gcc obj/usb_desc.o obj/usb_application.o obj/osc.o obj/usb.o obj/main.o obj/system_stm32f1xx.o obj/queue.o obj/list.o obj/heap_1.o obj/port.o obj/tasks.o obj/timers.o obj/startup_stm32f103x6.o -TSTM32F103X8_FLASH.ld -mthumb -mcpu=cortex-m3 --specs=nosys.specs -Wl,-Map,bin/blink.map -o bin/blink.elf
arm-none-eabi-objdump -D bin/blink.elf > bin/blink.lst
arm-none-eabi-size --format=SysV bin/blink.elf
bin/blink.elf :
section size addr
.isr_vector 268 134217728
.text 13504 134218000
.rodata 44 134231504
.ARM 8 134231548
.init_array 8 134231556
.fini_array 4 134231564
.data 1264 536870912
.jcr 4 536872176
.bss 1348 536872180
._user_heap_stack 1536 536873528
.pma 256 1073766400
.ARM.attributes 41 0
.debug_info 26748 0
.debug_abbrev 5331 0
.debug_aranges 368 0
.debug_line 5274 0
.debug_str 8123 0
.comment 29 0
.debug_frame 4988 0
Total 69146
arm-none-eabi-objcopy -R .stack -O binary bin/blink.elf bin/blink.bin
我看到了 .pma
正如我预期的那样,使用了 256 个字节。地址看起来也是正确的。现在,当我 ls
bin
目录我对此表示欢迎:
-rwxr-xr-x 1 kevin users 939548800 Nov 2 00:04 blink.bin*
-rwxr-xr-x 1 kevin users 221528 Nov 2 00:04 blink.elf*
那个bin
文件是我通过 openocd 加载到芯片闪存上的内容。它是从 0x08000000 开始的闪存图像。
旁注:实际上,在我意识到它有多大之前,我曾尝试将该 bin 文件加载到我的芯片上……这显然不起作用。
这是我删除 PMA 部分后得到的结果:
arm-none-eabi-size --format=SysV bin/blink.elf
bin/blink.elf :
section size addr
.isr_vector 268 134217728
.text 13504 134218000
.rodata 44 134231504
.ARM 8 134231548
.init_array 8 134231556
.fini_array 4 134231564
.data 1392 536870912
.jcr 4 536872304
.bss 1348 536872308
._user_heap_stack 1536 536873656
.ARM.attributes 41 0
.debug_info 26748 0
.debug_abbrev 5331 0
.debug_aranges 368 0
.debug_line 5274 0
.debug_str 8123 0
.comment 29 0
.debug_frame 4988 0
Total 69018
文件大小与我预期的完全一样:
-rwxr-xr-x 1 kevin users 15236 Nov 2 00:09 blink.bin
-rwxr-xr-x 1 kevin users 198132 Nov 2 00:09 blink.elf
据我了解,这里发生的事情是 objcopy
刚刚从 0x08000000
复制了所有内容至 0x400060FF
进入那个bin文件。这显然不是我想要发生的。我预计它只会复制闪存。
现在,显然我只能说 -R .pma
在我的 objcopy
命令,一切都会快乐。然而,我很好奇的是如何objcopy
知道不要复制.data
进入二值图像。我注意到正在运行 objcopy -R .data
与运行 objcopy
的结果完全相同没有那个。与 .bss
相同.这告诉我它不是 AT
链接描述文件中的命令(这是我在 .data
和 .bss
之间看到的唯一真正区别)
我能做些什么来制作我的 .pma
部分的行为方式与 .data
相同或 .bss
来自 objcopy
的视角? .data
有什么有趣的事情发生吗?/.bss
在我正在使用的中间 elf 文件中(参见上面生成 elf 文件的链接器命令)?
最佳答案
将您的部分定义为“.pma”很可能赋予它类型“PROGBITS”(使用 readelf 检查),这表示要加载到目标上的部分。
您想要/需要的是定义一个不必加载到目标上的部分,例如类型为“NOBITS”的“.bss”部分。
我经常使用以下部分定义来避免将某些缓冲区放入“.bss”部分(因为这会由于“.bss”部分的零初始化而减慢启动阶段):
static uint8_t uart1_buffer_rx[4096] __attribute__((section(".noinit,\"aw\",%nobits@")));
我不记得为什么我使用名称“.noinit”,但是这部分出现在“.bss”部分之后。
在您的情况下,在“.pma”部分声明之后添加“aw”和“nobits”标志可能会有所帮助。
关于c - 为什么 objcopy 排除一个部分而不排除另一个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40372977/
因为我是 binutils、gcc 和其他人的新手,所以我有一些一般性问题,我在手册中找不到这些问题。 我正在使用 C 和程序集(nasm 语法),我需要输出的原始二进制文件。首先,我将代码编译为带有
已阅读此内容但无法解决我的问题。 huge binary files with objcopy 为了一些测试需要。我必须在链接时添加以下链接脚本。 .section_test 0x11323000:
我打算使用 objcopy 将文本文件的二进制形式包含到可执行文件中。 (在运行时我需要文件作为字符串)。这工作正常,直到链接器需要从符号名称中找到引用。问题是 objcopy 在符号名称前加上文件的
我正在出于自己的教育目的构建 Risk-V CPU 模拟器。我有小型 POC 工作,想要构建示例程序并在模拟器上测试它们。 我正在尝试用 Rust 构建示例程序,似乎取得了一些不错的进展,但是当我必须
我需要在我的项目中包含一个二进制程序。我使用 objcopy 从二进制文件创建对象文件。目标文件可以在我的程序中链接。 objcopy 创建适当的符号来访问二进制数据。 例子 objcopy -I b
我在 bash (ubuntu linux) 上使用 objcopy,并尝试使用以下命令从 ELF 文件复制 2 个部分: objcopy -j .section1 -j .section2 问题是
背景 我试图在我的 STM32 设备上使用一个特殊的 SRAM 部分,该部分位于地址 0x40006000 .我在 ST 的示例代码中看到的一种方法是简单地创建指针,其值恰好位于 RAM 的该部分内。
我编译了一个 Hello World C 文件,只需要其中的一个部分(只有 hello world 函数)。 编译后的文件格式为 elf32-i386,包含 4 个部分:.rodata、.text.h
当我在 ARM9 处理器的基本 C 程序中定义全局变量时遇到问题。我正在使用 EABI GNU 编译器,从 12KB elf 生成的二进制文件是 4GB!我认为问题出在我的分散文件上,但我无法理解它。
这两个命令在linux上是吗: objcopy --only-keep-debug foo foo.dbg objcopy --add-gnu-debuglink=foo.dbg foo 相当于 Ma
假设我运行 arm-none-eabi-objcopy firmwared.elf -O ihex firmware.hex 假设二进制文件是使用以下链接器脚本生成的: ENTRY(Reset_Han
我有这个带有以下命令的 Makefile: all: gcc -MD -fno-builtin -nostdinc -fno-stack-protector -Os -g -m32 -I. -
我有 STM32F404 板,我正在尝试刷新它。我正在关注这个 tutorial . 项目中Makefile $(PROJ_NAME).elf: $(SRCS) $(CC) $(CFLAGS)
我想使用类似于 binutils 的 objcopy --redefine-syms 工具的 Mac 版本来重命名目标文件 (.o) 内的符号。 我没有找到arm-apple-darwin10-obj
我正在寻找与 GNU 工具 objcopy 等效的 Windows。我正在寻找实现 suggestion posted here对于我的问题,但是我需要跨平台(Windows、Linux 和 Mac)
确实有两个问题与 --add-section 的使用有关。简单的就如标题所示。根据我的阅读,我无法弄清楚如何执行 --add-section。 要使用 add-section,我必须传递一个节名称。如
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我试图使用 objcopy --writable-text executable_name 使 elf 二进制文件的 .text 部分可写。命令正常执行,没有任何错误。 在通过readelf检查部分权
先决条件 第三方提供了使用共享对象 libfoo.so 的 C++ 可执行文件 fooapp。该库还带有一个 header foo.hpp,因此开发人员可以构建其他应用程序: /* foo.hpp *
有没有办法覆盖具有静态范围的函数在对象模块中? 如果我从这样的东西开始,一个模块具有全局符号“foo”的函数调用调用本地符号“baz”的本地符号“bar” [scameron@localhost ~]
我是一名优秀的程序员,十分优秀!