Date: Tue, 3 Nov 2009 22:35:38 +0100 From: Juergen Lock <nox@jelal.kn-bremen.de> To: Dirk Meyer <dinoex@FreeBSD.org> Cc: cvs-ports@FreeBSD.org, Ian Lance Taylor <iant@google.com>, sprewell@jaggeri.com, cvs-all@FreeBSD.org, ports-committers@FreeBSD.org Subject: Re: cvs commit: ports/devel/gold Makefile Message-ID: <20091103213538.GA61624@triton8.kn-bremen.de> In-Reply-To: <200909211911.n8LJBlUK002650@repoman.freebsd.org> References: <200909211911.n8LJBlUK002650@repoman.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Sep 21, 2009 at 07:11:47PM +0000, Dirk Meyer wrote: > dinoex 2009-09-21 19:11:47 UTC > > FreeBSD ports repository > > Modified files: > devel/gold Makefile > Log: > - mark BROKEN for FreeBSD 6.x > Feature safe: yes 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... There is code to print this header in jkoshy's libelf article, http://people.freebsd.org/~jkoshy/download/libelf/article.html#SEC.ELF-PHDR (4.1 Reading a Program Header Table using gelf(3), Figure 13. Printing the Program Header Table), running that on the above executable gives: PHDR 2: p_type 0x6 "PHDR" p_offset 0x40 p_vaddr 0x400040 p_paddr 0x400040 p_filesz 0x150 p_memsz 0x150 p_flags 0x4 [ read ] p_align 0x8 PHDR 2: p_type 0x3 "INTERP" p_offset 0x1174 ^^^^^^ here is the problem p_vaddr 0x401174 p_paddr 0x401174 p_filesz 0x15 p_memsz 0x15 p_flags 0x4 [ read ] p_align 0x1 PHDR 2: p_type 0x1 "LOAD" p_offset 0x0 p_vaddr 0x400000 p_paddr 0x400000 p_filesz 0x11f8 p_memsz 0x11f8 p_flags 0x5 [ execute read ] p_align 0x1000 PHDR 2: p_type 0x1 "LOAD" p_offset 0x11f8 p_vaddr 0x4021f8 p_paddr 0x4021f8 p_filesz 0x220 p_memsz 0x230 p_flags 0x6 [ read write ] p_align 0x1000 PHDR 2: p_type 0x2 "DYNAMIC" p_offset 0x1238 p_vaddr 0x402238 p_paddr 0x402238 p_filesz 0x140 p_memsz 0x140 p_flags 0x6 [ read write ] p_align 0x8 PHDR 2: p_type 0x6474e550 "unknown" p_offset 0xae8 p_vaddr 0x400ae8 p_paddr 0x400ae8 p_filesz 0x8 p_memsz 0x8 p_flags 0x4 [ read ] p_align 0x4 HTH, Juergen PS: I added the gold author, Ian Lance Taylor, to the Cc, hope thats ok...
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20091103213538.GA61624>