Date: 02 Feb 2002 14:29:55 +0100 From: Dag-Erling Smorgrav <des@ofug.org> To: John Hay <jhay@icomtek.csir.co.za> Cc: obrien@FreeBSD.org, cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/contrib/binutils Message-ID: <xzpwuxwxb8s.fsf@flood.ping.uio.no> In-Reply-To: <xzpu1t0ywvj.fsf@flood.ping.uio.no> References: <200202020459.g124xdL87420@zibbi.icomtek.csir.co.za> <xzpu1t0ywvj.fsf@flood.ping.uio.no>
next in thread | previous in thread | raw e-mail | index | archive | help
Dag-Erling Smorgrav <des@ofug.org> writes:
> ...which is obviously wrong. It seems the load address I computed for
> ld-elf.so.1 (MAXDSIZ + pngtest data offset + ld-elf text offset) is
> off by about 1500 bytes, though I have no idea why.
Doh! I forgot to round down to the nearest page boundary, like
imgact_elf does:
% objdump -h pngtest | grep Name
Idx Name Size VMA LMA File off Algn
% objdump -h pngtest | fgrep ' .data'
12 .data 00000060 0804c6e0 0804c6e0 000036e0 2**2
% objdump -h /usr/libexec/ld-elf.so.1 | fgrep ' .text'
5 .text 0000e660 00003238 00003238 00003238 2**2
% gdb pngtest
[...]
(gdb) run
Starting program: /usr/ports/graphics/png/work/libpng-1.2.1/pngtest
Program received signal SIGBUS, Bus error.
0x28053212 in ?? ()
(gdb) add-symbol-file /usr/libexec/ld-elf.so.1 (512*1024*1024 + 0x0804c000 + 0x00003238)
add symbol table from file "/usr/libexec/ld-elf.so.1" at text_addr = 0x2804f238?
(y or n) y
Reading symbols from /usr/libexec/ld-elf.so.1...done.
(gdb) up 0
#0 0x28053212 in reloc_non_plt (obj=0x28065100, obj_rtld=0x28061840)
at /usr/src/libexec/rtld-elf/i386/reloc.c:196
196 *where += (Elf_Addr) obj->relocbase;
(gdb) p/x *rel
$1 = {r_offset = 0x1c025, r_info = 0x8}
(gdb) p/x *obj
$2 = {magic = 0x0, version = 0x0, next = 0x28065200, path = 0x28064020,
refcount = 0x1, dl_refcount = 0x0, mapbase = 0x2806b000, mapsize = 0x22000,
textsize = 0x21000, vaddrbase = 0x0, relocbase = 0x2806b000,
dynamic = 0x2808c788, entry = 0x28070674, phdr = 0x0, phsize = 0x0,
interp = 0x0, pltgot = 0x2808c850, rel = 0x2806ef40, relsize = 0x140,
rela = 0x0, relasize = 0x0, pltrel = 0x2806f080, pltrelsize = 0x748,
pltrela = 0x0, pltrelasize = 0x0, symtab = 0x2806bb34, strtab = 0x2806d524,
strsize = 0x1a1a, buckets = 0x2806b09c, nbuckets = 0x107,
chains = 0x2806b4b8, nchains = 0x19f, rpath = 0x0, needed = 0x28067040,
init = 0x2806f7c8, fini = 0x28088618, mainprog = 0x0, rtld = 0x0,
textrel = 0x0, symbolic = 0x0, traced = 0x0, jmpslots_done = 0x0,
init_done = 0x0, linkmap = {l_addr = 0x2806b000, l_name = 0x28064020,
l_ld = 0x2808c788, l_next = 0x28065298, l_prev = 0x28065098}, dldags = {
stqh_first = 0x0, stqh_last = 0x280651ac}, dagmembers = {stqh_first = 0x0,
stqh_last = 0x280651b4}, dev = 0x7404, ino = 0x59d45, priv = 0x0}
(gdb) p/x where
$3 = 0x28087025
(gdb) p/x *where
$4 = 0x21760
(gdb) p/x obj->relocbase
$5 = 0x2806b000
(gdb) p/x (*where + (Elf_Addr)obj->relocbase)
$6 = 0x2808c760
(gdb) p/x *(*where + (Elf_Addr)obj->relocbase)
$7 = 0xffffff
That still doesn't tell us *why* it dumped core - and SIGBUS can mean
a lot of things... Most likely reason here is that *where isn't
writeable, though it *should* be, but I don't know why, and I don't
know why no other code is affected.
DES
--
Dag-Erling Smorgrav - des@ofug.org
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?xzpwuxwxb8s.fsf>
