bug-gnu-utils
[Top][All Lists]
Advanced

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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]