[PATCH] ARM: Add support for thumb1 PCROP relocations.

mickael guene mickael.guene@st.com
Mon Nov 23 08:43:00 GMT 2015


Hi all,

This is a proposal for a patch that implements the new ARM relocations
needed to support execute-only code segment for thumb1 code sequences.

Some STM32 MCUs implement a security feature called 'Proprietary Code
Read-Out Protection' aka PCROP that forbids data read access to some
code areas (only fetch access is allowed).
This protection prevents usage of literal pools (since one cannot load
data from code sections), so compilers have to use specific code
sequence to generate constants. This is particularly a problem to
generate symbol addresses.

For armv7-m architecture compilers can generate movt/movw pair
instructions relying on R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_ABS
relocations support.
For armv6-m there is currently no possibility to generate such symbol
addresses.
This is why the ARM ABI defines four new relocations that allow
symbol address generation in armv6-m architecture using a sequence of
movs/adds/lsls instructions.

This patch implements this feature in gas and bfd.

Unit tests have be written to check correct implementation for both
gas and bfd.
No regressions have been observed for arm-linux-gnueabi,
arm-linux-gnueabihf, arm-none-eabi, arm-none-nacl and
armeb-linux-gnueabihf targets on 64 bits linux host.

Changelogs:

include/ChangeLog:

2015-11-17  Mickael Guene <mickael.guene@st.com>

	* elf/arm.h: Add new arm relocations.

bfd/ChangeLog:

2015-11-17  Mickael Guene <mickael.guene@st.com>

	* bfd-in2.h: Regenerate.
	* reloc.c: Add new relocations.
	* libbfd.h (bfd_reloc_code_real_names): Add new relocations display
	names.
	* elf32-arm.c (elf32_arm_howto_table_1): Add HOWTO for new relocations.
	(elf32_arm_reloc_map): Add bfd/arm mapping for new relocations.
	(elf32_arm_final_link_relocate): Implement new relocations resolution.

gas/ChangeLog:

2015-11-17  Mickael Guene <mickael.guene@st.com>

	* config/tc-arm.c (group_reloc_table): Add mapping between gas syntax
	and new relocations.
	(do_t_add_sub): Keep new relocations for add operand.
	(do_t_mov_cmp): Keep new relocations for mov operand.
	(insns): Use 'shifter operand with possible group relocation' operand
	parse code for movs operand.
	(md_apply_fix): Implement mov and add encoding when new relocations
	on them.
	(tc_gen_reloc): Add new relocations.
	(arm_fix_adjustable): Since offset has a limited range ([0:255]) we
	disable adjust_reloc_syms() for new relocations.

gas/testsuite/ChangeLog:

2015-11-17  Mickael Guene <mickael.guene@st.com>

	* gas/arm/adds-thumb1-reloc-local.d: New
	* gas/arm/adds-thumb1-reloc-local.s: New
	* gas/arm/movs-thumb1-reloc-local.d: New
	* gas/arm/movs-thumb1-reloc-local.s: New

ld/testsuite/ChangeLog:

2015-11-17  Mickael Guene <mickael.guene@st.com>

	* ld-arm/arm-elf.exp (armelftests_common): Add new relocations tests.
	* ld-arm/thumb1-adds.d: New
	* ld-arm/thumb1-adds.s: New
	* ld-arm/thumb1-movs.d: New
	* ld-arm/thumb1-movs.s: New
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Add-support-for-thumb1-pcrop-relocations.patch
Type: text/x-patch
Size: 21819 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20151123/056574a5/attachment.bin>


More information about the Binutils mailing list