gpt4 book ai didi

c++ - 在内存开始分配的成员变量

转载 作者:行者123 更新时间:2023-12-05 05:29:21 25 4
gpt4 key购买 nike

我正在尝试在使用 gcc 编译的 STM32 设备上使用 c++。设备加载代码并开始执行它,但在写入任何成员变量时出现硬故障。

我可以通过 GDB 看到成员变量存储在内存的开头(具体为 0x7),当然,STM32 硬故障会在该位置的第一次写入时出现。

我可以看到 BSS 部分不会生成,除非我在 main 中声明一个变量(在最终的 elf 文件中使用 readelf)。

成员变量不应该放在bss中吗?

我正在使用 -nostdlib -mcpu=cortex-m0plus -fno-exceptions -O0 -g 进行编译和链接。

链接描述文件是:


ENTRY(start_of_memory);

MEMORY {

rom (rx) : ORIGIN = 0x08000000, LENGTH = 16K
ram (xrw) : ORIGIN = 0x20000000, LENGTH = 2K

}

SECTIONS {

.text : {
*(.text)
} > rom

.data : {
*(.data)
*(.data.*)
} > ram

.bss : {
*(.bss)
*(.bss.*)
*(COMMON)
} > ram

}

readelf 的输出(没有变量声明,只有对象使用):

ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x8000000
Start of program headers: 52 (bytes into file)
Start of section headers: 76536 (bytes into file)
Flags: 0x5000200, Version5 EABI, soft-float ABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 1
Size of section headers: 40 (bytes)
Number of section headers: 14
Section header string table index: 13

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 08000000 010000 0005a8 00 AX 0 0 4
[ 2] .rodata PROGBITS 080005a8 0105a8 00005c 00 A 0 0 4
[ 3] .ARM.attributes ARM_ATTRIBUTES 00000000 010604 00002d 00 0 0 1
[ 4] .comment PROGBITS 00000000 010631 000049 01 MS 0 0 1
[ 5] .debug_info PROGBITS 00000000 01067a 000a93 00 0 0 1
[ 6] .debug_abbrev PROGBITS 00000000 01110d 0003b8 00 0 0 1
[ 7] .debug_aranges PROGBITS 00000000 0114c5 000060 00 0 0 1
[ 8] .debug_line PROGBITS 00000000 011525 000580 00 0 0 1
[ 9] .debug_str PROGBITS 00000000 011aa5 000416 01 MS 0 0 1
[10] .debug_frame PROGBITS 00000000 011ebc 000228 00 0 0 4
[11] .symtab SYMTAB 00000000 0120e4 000640 10 12 86 4
[12] .strtab STRTAB 00000000 012724 000344 00 0 0 1
[13] .shstrtab STRTAB 00000000 012a68 00008f 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
y (purecode), p (processor specific)

There are no section groups in this file.

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x010000 0x08000000 0x08000000 0x00604 0x00604 R E 0x10000

Section to Segment mapping:
Segment Sections...
00 .text .rodata

There is no dynamic section in this file.

There are no relocations in this file.

There are no unwind sections in this file.

Symbol table '.symtab' contains 100 entries:

Main(初始化平台可能不使用任何变量):

int main(void) {

init_platform(SPEED_4_MHz);

gpio testpin(GPIO_A, 5);
testpin.dir(MODE_OUTPUT);

while (1) {

testpin.high();
wait();
testpin.low();
wait();
}

return 0;

}

更新#1:

vector 表在内存开始处,sp和msp初始化成功。

(gdb) p/x *0x00000000
$2 = 0x20000700
(gdb) p/x *0x00000004
$3 = 0x80000f1
(gdb) info registers
sp 0x20000700 0x20000700
lr 0xffffffff -1
pc 0x80000f6 0x80000f6 <main()+6>
xPSR 0xf1000000 -251658240
msp 0x20000700 0x20000700
psp 0xfffffffc 0xfffffffc

在 GPIO 类的构造函数上放置一个断点,我可以看到变量位于 0x00000XXX

Breakpoint 2, gpio::gpio (this=0x7, port=0 '\000', pin=5 '\005') at gpio.cpp:25
25 mypin = pin;
(gdb) p/x &mypin
$6 = 0xb

我试图让 mypin 成为一个公共(public)成员变量(原来是私有(private)的),但没有做任何改变。

开始认为 C++ 需要动态分配。

最佳答案

地址0x7在ROM中的初始 vector 表中,不可写。

不幸的是,您没有用于填充 vector 表的部分,因此此代码永远无法运行。您似乎也没有堆栈,堆栈是放置 gpio 成员的地方(因为它是在没有 static 关键字的函数内定义的)。

首先获取作为 STM32Cube 包的一部分提供的链接器脚本,然后(如果必须的话)一次修改它一点点,直到你破坏它。然后你就会知道你弄坏了什么。编写这样一个简单的链接器脚本并期望它在微 Controller 上运行是不合理的。

关于c++ - 在内存开始分配的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75025382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com