On Thu, May 12, 2005 at 08:13:27AM +0200, Peter S. Mazinger wrote:
> On Wed, 11 May 2005, H. J. Lu wrote:
> 
> > On Thu, May 12, 2005 at 12:48:46AM +0200, Peter S. Mazinger wrote:
> > > Hello!
> > > 
> > > I have gotten under peculiar circumstances following:
> > > (sysvinit) init.o: relocation R_386_GOTOFF against protected function 
> > > `main' can not be used when making a shared object
> > > 
> > > libc.so does not provide a weak 'main', main() is in crt1.o defined in 
> > > asm 
> > > as '.protected main'.
> > > 
> > > init is built as -pie executable.
> > > 
> > > I think this check is valid if a shared lib is created, but not valid for 
> > > a PIE executable.
> > > 
> > > I think, that a check info->shared should be changed to
> > > info->shared && !info->pie (or !info->executable), to allow pie to be 
> > > linked, but I can't locate the one needed for this.
> > > 
> > > Thanks, Peter
> > 
> > This is a gcc bug
> > 
> > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19520
> 
> Reading through this, I came to the patch you posted on 2005-02-06 for 
> elf32-i386.c. The comment says: 
> 
> +2005-02-06  H.J. Lu  <[EMAIL PROTECTED]>
> +
> +     * elf32-i386.c (elf_i386_relocate_section): Disallow R_386_GOTOFF
> +     against protected function when building shared library.
> 
> If you intented to do this only for shared libraries, but not for PIE 
> executables, then info->shared is incorrect, and as I proposed has to be 
> changed.
> 

I checked in the following patch.

FYI, using protected function in executable has no benefit since
noone can override function in executable anyway.


H.J.
----
2005-05-12  H.J. Lu  <[EMAIL PROTECTED]>

        * elf32-i386.c (elf_i386_relocate_section): Allow R_386_GOTOFF
        against protected function when building executable.

--- bfd/elf32-i386.c.pie        2005-05-12 10:00:49.000000000 -0700
+++ bfd/elf32-i386.c    2005-05-12 13:55:04.000000000 -0700
@@ -2390,6 +2390,7 @@ elf_i386_relocate_section (bfd *output_b
             for shared library since it may not be local when used
             as function address.  */
          if (info->shared
+             && !info->executable
              && h
              && h->def_regular
              && h->type == STT_FUNC

Reply via email to