[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: problem with -q
From: |
Alan Modra |
Subject: |
Re: problem with -q |
Date: |
Tue, 23 Jul 2002 14:07:36 +0930 |
User-agent: |
Mutt/1.3.25i |
On Mon, Jul 22, 2002 at 11:04:52AM -0400, Robert Cohn wrote:
> Since -q is used, emit_relocs is on and after processing the text section, it
> emits the relocation. As part of this processing, it updates st_value in the
> symbol by replacing the section relative offset with the absolute address.
> Next
> the data section is processed. When it processes the relocation that refers to
> the same symbol, it computes the value by adding in the section beginning,
> even
> though this is already an absolute address (_bfd_elf_rela_local_sym).
Thanks for the excellent bug report and analysis. This should cure
the problem.
* elflink.h (elf_link_input_bfd): Don't change internal symbols
when outputting relocs.
Applying mainline and branch.
--
Alan Modra
IBM OzLabs - Linux Technology Centre
Index: bfd/elflink.h
===================================================================
RCS file: /cvs/src/src/bfd/elflink.h,v
retrieving revision 1.177
diff -u -p -r1.177 elflink.h
--- bfd/elflink.h 16 Jul 2002 12:31:35 -0000 1.177
+++ bfd/elflink.h 23 Jul 2002 04:25:43 -0000
@@ -6967,6 +6967,7 @@ elf_link_input_bfd (finfo, input_bfd)
{
unsigned long r_symndx;
asection *sec;
+ Elf_Internal_Sym sym;
if (next_erel == bed->s->int_rels_per_ext_rel)
{
@@ -7019,9 +7020,9 @@ elf_link_input_bfd (finfo, input_bfd)
/* This is a reloc against a local symbol. */
*rel_hash = NULL;
- isym = isymbuf + r_symndx;
+ sym = isymbuf[r_symndx];
sec = finfo->sections[r_symndx];
- if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
+ if (ELF_ST_TYPE (sym.st_info) == STT_SECTION)
{
/* I suppose the backend ought to fill in the
section of any STT_SECTION symbol against a
@@ -7068,34 +7069,34 @@ elf_link_input_bfd (finfo, input_bfd)
must output it now. */
shlink = symtab_hdr->sh_link;
name = (bfd_elf_string_from_elf_section
- (input_bfd, shlink, isym->st_name));
+ (input_bfd, shlink, sym.st_name));
if (name == NULL)
return false;
osec = sec->output_section;
- isym->st_shndx =
+ sym.st_shndx =
_bfd_elf_section_from_bfd_section (output_bfd,
osec);
- if (isym->st_shndx == SHN_BAD)
+ if (sym.st_shndx == SHN_BAD)
return false;
- isym->st_value += sec->output_offset;
+ sym.st_value += sec->output_offset;
if (! finfo->info->relocateable)
{
- isym->st_value += osec->vma;
- if (ELF_ST_TYPE (isym->st_info) == STT_TLS)
+ sym.st_value += osec->vma;
+ if (ELF_ST_TYPE (sym.st_info) == STT_TLS)
{
/* STT_TLS symbols are relative to PT_TLS
segment base. */
BFD_ASSERT (finfo->first_tls_sec != NULL);
- isym->st_value -= finfo->first_tls_sec->vma;
+ sym.st_value -= finfo->first_tls_sec->vma;
}
}
finfo->indices[r_symndx]
= bfd_get_symcount (output_bfd);
- if (! elf_link_output_sym (finfo, name, isym, sec))
+ if (! elf_link_output_sym (finfo, name, &sym, sec))
return false;
}
- problem with -q, Robert Cohn, 2002/07/22
- Re: problem with -q,
Alan Modra <=