This is the mail archive of the mailing list for the binutils project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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

Hi Ramana,

 Thanks for your feedback. I agree with you about gas
directives names. Your names proposal are better than
mines, but I'm still not happy with them since for instance
'lower0_8' seems to imply  bit  numbers (but then should be lower0_7)
whereas pre-existing 'lower16' seems to imply a size. If someone
has a better idea for those names, feel free to
contribute !!!


On 12/01/2015 04:31 PM, Ramana Radhakrishnan wrote:
On Mon, Nov 23, 2015 at 8:43 AM, mickael guene <> wrote:
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
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.

I am not happy about directives like low_low, low_high, high_low and
high_high - without thinking much about it, I would much rather see
something like lower0_8 , lower8_16 , upper0_8 and upper8_16 in line
with the pre-existing lower16 and upper16 directives.




2015-11-17  Mickael Guene <>

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


2015-11-17  Mickael Guene <>

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


2015-11-17  Mickael Guene <>

         * config/tc-arm.c (group_reloc_table): Add mapping between gas
         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'
         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.


2015-11-17  Mickael Guene <>

         * 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


2015-11-17  Mickael Guene <>

         * ld-arm/arm-elf.exp (armelftests_common): Add new relocations
         * ld-arm/thumb1-adds.d: New
         * ld-arm/thumb1-adds.s: New
         * ld-arm/thumb1-movs.d: New
         * ld-arm/thumb1-movs.s: New

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]