mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-11-04 06:57:38 +00:00
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.
77 lines
2.0 KiB
Plaintext
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
|
|
}
|