Files
proxmark3/bootrom/ldscript-flash-common
T
Adrian fbdbaf3c9e Include COMMON globals in bootrom BSS initialization
The bootrom linker script defines __bss_end__ before COMMON symbols are
placed. Startup clears only up to that boundary. On PM5 with ARM GCC 8.5,
this leaves the entire 92-byte USB CDC structure outside the zeroed area,
even though bootrom sources themselves are built with -fno-common.

Place COMMON inside .bss before setting __bss_end__, and assert that the
boundary covers the whole section. The shared script applies to PM5 and
RDV4. On the tested PM5 build, stack addresses, the shared communication
area and the entry point remain unchanged.

Built both targets with ARM GCC 8.5 and ran bootrom/check. Checked ELF
boundaries and the 16 KiB boot partition; removing COMMON placement
triggers the new assertion. No compiler warnings; the existing PM5 RWX
LOAD-segment linker warning remains. CMake and BWM builds were not tested.

Flashed the bootrom alone on PM5 and verified readback against the image.
All internal flash bytes from the OS start onward matched the pre-flash
backup. Cold startup and five software reset cycles passed. Five complete
bootloader/read/reset cycles also passed after fixing the client's dump
cleanup separately. FPGA was not written. This corrects initialization;
it does not establish a fix for the USB-controller failures in #3642.
2026-10-27 17:11:20 +00:00

77 lines
2.0 KiB
Plaintext

/*
-----------------------------------------------------------------------------
Copyright (C) Jonathan Westhues, Mar 2006
Copyright (C) Proxmark3 contributors. See AUTHORS.md for details.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
See LICENSE.txt for the text of the license.
-----------------------------------------------------------------------------
Bootrom linker script common to all flash-based targets.
-----------------------------------------------------------------------------
*/
PHDRS
{
phase1 PT_LOAD;
phase2 PT_LOAD;
bss PT_LOAD;
}
ENTRY(flashstart)
SECTIONS
{
.bootphase1 : {
*(.startup)
. = ALIGN(4);
_version_information_start = .;
KEEP(*(.version_information));
. = LENGTH(bootphase1) - 0x4;
LONG(_version_information_start);
} >bootphase1 :phase1
.bootphase2 : {
KEEP(*(.startphase2))
*(.text)
*(.text.*)
*(.eh_frame)
*(.glue_7)
*(.glue_7t)
*(.rodata)
*(.rodata.*)
*(.data)
*(.data.*)
*(.ramfunc)
. = ALIGN(4);
} >ram AT>bootphase2 :phase2
__bootphase2_src_start__ = LOADADDR(.bootphase2);
__bootphase2_start__ = ADDR(.bootphase2);
__bootphase2_end__ = __bootphase2_start__ + SIZEOF(.bootphase2);
.bss : {
__bss_start__ = .;
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
__bss_end__ = .;
} >ram AT>ram :bss
ASSERT(__bss_end__ == ADDR(.bss) + SIZEOF(.bss), "BSS boundary excludes globals")
.commonarea (NOLOAD) : {
*(.commonarea)
} >commonarea
}