diff options
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-rx.c | 37 | ||||
-rw-r--r-- | ld/ChangeLog | 12 | ||||
-rw-r--r-- | ld/emultempl/rxelf.em | 24 |
4 files changed, 61 insertions, 20 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a5355b5..0e8bdf1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2011-05-17 Tomohiro Kashiwada <kikairoya@gmail.com> + + PR ld/12759 + * elf32-rx.c (ignore_lma): New variable. + (bfd_elf32_rx_set_target_flags): Add ignore_lma parameter. + (rx_modify_program_headers): Only copy the LMA into the VMA if + ignore_lma is true. + 2011-05-17 Alan Modra <amodra@gmail.com> PR ld/12760 diff --git a/bfd/elf32-rx.c b/bfd/elf32-rx.c index 55f2eaa..5691ced 100644 --- a/bfd/elf32-rx.c +++ b/bfd/elf32-rx.c @@ -2855,13 +2855,16 @@ rx_elf_set_private_flags (bfd * abfd, flagword flags) } static bfd_boolean no_warn_mismatch = FALSE; +static bfd_boolean ignore_lma = TRUE; -void bfd_elf32_rx_set_target_flags (bfd_boolean); +void bfd_elf32_rx_set_target_flags (bfd_boolean, bfd_boolean); void -bfd_elf32_rx_set_target_flags (bfd_boolean user_no_warn_mismatch) +bfd_elf32_rx_set_target_flags (bfd_boolean user_no_warn_mismatch, + bfd_boolean user_ignore_lma) { no_warn_mismatch = user_no_warn_mismatch; + ignore_lma = user_ignore_lma; } /* Merge backend specific data from an object file to the output @@ -3332,22 +3335,24 @@ elf32_rx_modify_program_headers (bfd * abfd ATTRIBUTE_UNUSED, phdr = tdata->phdr; count = tdata->program_header_size / bed->s->sizeof_phdr; - for (i = count; i-- != 0; ) - if (phdr[i].p_type == PT_LOAD) - { - /* The Renesas tools expect p_paddr to be zero. However, - there is no other way to store the writable data in ROM for - startup initialization. So, we let the linker *think* - we're using paddr and vaddr the "usual" way, but at the - last minute we move the paddr into the vaddr (which is what - the simulator uses) and zero out paddr. Note that this - does not affect the section headers, just the program - headers. We hope. */ + if (ignore_lma) + for (i = count; i-- != 0;) + if (phdr[i].p_type == PT_LOAD) + { + /* The Renesas tools expect p_paddr to be zero. However, + there is no other way to store the writable data in ROM for + startup initialization. So, we let the linker *think* + we're using paddr and vaddr the "usual" way, but at the + last minute we move the paddr into the vaddr (which is what + the simulator uses) and zero out paddr. Note that this + does not affect the section headers, just the program + headers. We hope. */ phdr[i].p_vaddr = phdr[i].p_paddr; - /* If we zero out p_paddr, then the LMA in the section table +#if 0 /* If we zero out p_paddr, then the LMA in the section table becomes wrong. */ - /*phdr[i].p_paddr = 0;*/ - } + phdr[i].p_paddr = 0; +#endif + } return TRUE; } diff --git a/ld/ChangeLog b/ld/ChangeLog index 7b782c8..d0b2157 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,15 @@ +2011-05-17 Tomohiro Kashiwada <kikairoya@gmail.com> + + PR ld/12759 + * emultempl/rxelf.em (ignore_lma): New variable. + (rx_elf_create_output_section_statements): Pass the setiing of + ignore_lma to bfd_elf32_rx_set_target_flags. + (OPTION_IGNORE_LMA): Define. + (OPTION_NO_IGNORE_LMA): Define. + (PARSE_AND_LIST_LONGOPTS): Add ignore lma. + (PARSE_AND_LIST_OPTIONS): Add ignore lma. + (PARSE_AND_LIST_ARGS_CASES): Add ignore lma. + 2011-05-17 Alan Modra <amodra@gmail.com> PR ld/12760 diff --git a/ld/emultempl/rxelf.em b/ld/emultempl/rxelf.em index c4a2dac..159a649 100644 --- a/ld/emultempl/rxelf.em +++ b/ld/emultempl/rxelf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2009 Free Software Foundation, Inc. +# Copyright 2009, 2011 Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -26,15 +26,16 @@ test -z "$TARGET2_TYPE" && TARGET2_TYPE="rel" fragment <<EOF static bfd_boolean no_flag_mismatch_warnings = FALSE; +static bfd_boolean ignore_lma = TRUE; /* This is a convenient point to tell BFD about target specific flags. After the output has been created, but before inputs are read. */ static void rx_elf_create_output_section_statements (void) { - extern void bfd_elf32_rx_set_target_flags (bfd_boolean); + extern void bfd_elf32_rx_set_target_flags (bfd_boolean, bfd_boolean); - bfd_elf32_rx_set_target_flags (no_flag_mismatch_warnings); + bfd_elf32_rx_set_target_flags (no_flag_mismatch_warnings, ignore_lma); } EOF @@ -44,21 +45,36 @@ EOF # PARSE_AND_LIST_PROLOGUE=' #define OPTION_NO_FLAG_MISMATCH_WARNINGS 301 +#define OPTION_IGNORE_LMA 302 +#define OPTION_NO_IGNORE_LMA 303 ' PARSE_AND_LIST_LONGOPTS=' { "no-flag-mismatch-warnings", no_argument, NULL, OPTION_NO_FLAG_MISMATCH_WARNINGS}, + { "ignore-lma", no_argument, NULL, OPTION_IGNORE_LMA}, + { "no-ignore-lma", no_argument, NULL, OPTION_NO_IGNORE_LMA}, ' PARSE_AND_LIST_OPTIONS=' - fprintf (file, _(" --no-flag-mismatch-warnings Don'\''t warn about objects with incompatible" + fprintf (file, _(" --no-flag-mismatch-warnings Don'\''t warn about objects with incompatible\n" " endian or dsp settings\n")); + fprintf (file, _(" --ignore-lma Ignore segment LMAs [default]\n" + " (for Renesas Tools compatibility)\n")); + fprintf (file, _(" --no-ignore-lma Don'\''t ignore segment LMAs\n")); ' PARSE_AND_LIST_ARGS_CASES=' case OPTION_NO_FLAG_MISMATCH_WARNINGS: no_flag_mismatch_warnings = TRUE; break; + + case OPTION_IGNORE_LMA: + ignore_lma = TRUE; + break; + + case OPTION_NO_IGNORE_LMA: + ignore_lma = FALSE; + break; ' LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=rx_elf_create_output_section_statements |