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.

	* 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.
This commit is contained in:
Nick Clifton 2011-05-17 16:02:31 +00:00
parent 393eab5450
commit 84bff83f79
4 changed files with 61 additions and 20 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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