cvs commit: ports/devel/gold Makefile
Ian Lance Taylor
iant at google.com
Sat Nov 7 00:03:14 UTC 2009
Juergen Lock <nox at 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
More information about the cvs-ports
mailing list