Khi xây dựng một dự án MCU trần kim loại gcc, bạn cần phải quan tâm đến việc khởi tạo các phần .data và .bss trong khi khởi động.Làm cách nào để biết phần .data cần lấy dữ liệu init từ đâu? (gcc linker)
Phần .bss khá dễ dàng vì tôi chỉ cần điền toàn bộ phần vào 0. Nhưng các biến trong phần .data cần có dữ liệu khởi tạo trong rom/flash và được sao chép trong khi khởi động.
Làm cách nào để biết dữ liệu có giá trị khởi tạo có thể được tìm thấy ở đâu?
Hãy lấy một ví dụ.
Hãy nói rằng tôi tạo ra hai biến toàn cục trong main.c
unsigned int my_global_variable_one = 1;
unsigned int my_global_variable_two = 2;
Sau đó, tôi có thể sử dụng objdump trên đối tượng tập tin để xem những gì phần họ sẽ được ở, nhưng tôi không thể tìm thấy bất cứ điều gì trong objdump ra đặt nơi dữ liệu init nên được đặt.
$ arm-none-eabi-objdump --syms main.o | grep my_global_variable
00000000 g O .data 00000004 my_global_variable_one
00000004 g O .data 00000004 my_global_variable_two
Sau đó, tôi có thể xem kết quả của toàn bộ hệ thống, trong trường hợp này là main.elf.
$ arm-none-eabi-nm -n main.elf | grep my_global_variable
20000000 D my_global_variable_one
20000004 D my_global_variable_two
Tôi có thể tìm nơi ở để tôi có thể sao chép dữ liệu? Tôi cần phải đưa gì vào kịch bản trình liên kết của mình?
Nó phải ở dạng như .text hoặc .rodata, nhưng làm sao tôi biết?
Làm cách nào để kiểm tra nơi dữ liệu init cho my_global_variable_one là?
Tôi có thể tìm thấy dữ liệu này ở đâu với bất kỳ lệnh nào trong số các lệnh binutils như readelf hoặc objdump không?
/Cảm ơn
Đây là trên STM32 (Cortex M3) MCU, và phiên bản CodeBench của gcc được sử dụng.
Vâng, tôi nhận thấy rằng các dữ liệu được nối sau phần .text, nhưng bạn đã giúp tôi có được đủ gần :) – Johan