Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 06 Nov 2009 15:52:37 -0800
From:      Ian Lance Taylor <iant@google.com>
To:        Juergen Lock <nox@jelal.kn-bremen.de>
Cc:        Dirk Meyer <dinoex@freebsd.org>, cvs-ports@freebsd.org, sprewell@jaggeri.com, cvs-all@freebsd.org, ports-committers@freebsd.org
Subject:   Re: cvs commit: ports/devel/gold Makefile
Message-ID:  <mcr639nw6re.fsf@dhcp-172-17-9-151.mtv.corp.google.com>
In-Reply-To: <20091103213538.GA61624@triton8.kn-bremen.de> (Juergen Lock's message of "Tue\, 3 Nov 2009 22\:35\:38 %2B0100")
References:  <200909211911.n8LJBlUK002650@repoman.freebsd.org> <20091103213538.GA61624@triton8.kn-bremen.de>

index | next in thread | previous in thread | raw e-mail

Juergen Lock <nox@jelal.kn-bremen.de> writes:

> Is this about `exec format error' (ENOEXEC)?  We discussed this
> yesterday on irc (hi Sprewell! :) and found out that gold can produce
> executables that won't run on FreeBSD 7 and 8 too (for him it was
> chromium and some test executables on 7.2/i386, for me it was test
> executables on 8/amd64, I couldnt reproduce it here on 8 and 7 i386) -
> and after some debugging using qemu's gdbstub and a FreeBSD 8/amd64
> livefs guest that I scp'd a problem executable into I found out that
> its this condition in sys/kern/imgact_elf.c that fails:
> 	http://fxr.watson.org/fxr/source/kern/imgact_elf.c#L721
>
>   719                 if (phdr[i].p_type == PT_INTERP) {
>   720                         /* Path to interpreter */
>   721                         if (phdr[i].p_filesz > MAXPATHLEN ||
>   722                             phdr[i].p_offset + phdr[i].p_filesz > PAGE_SIZE)
> 				  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   723                                 return (ENOEXEC);
>   724                         interp = imgp->image_header + phdr[i].p_offset;
>   725                         break;
>   726                 }
>   727         }
>
> (gdb) p/x phdr[1].p_offset 
> $11 = 0x1174
> (gdb) p/x phdr[1].p_filesz 
> $12 = 0x15
> (gdb) 
>
>  So it seems our kernel expects this data (path of the `image activator'
> aka shared linker aka /libexec/ld-elf.so.1) to be in the first page of
> the executable...

Technically an ELF executable is permitted to have the PT_INTERP
segment anywhere it likes, so I think the kernel is in error here.

However, it is good practice to put PT_INTERP in the first page of the
executable, and I have made that change to gold.  So this issue should
be fixed in the next release of the GNU binutils.

Ian


help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?mcr639nw6re.fsf>