Date: Wed, 13 Nov 2002 13:39:58 +0100 From: Thomas Moestl <tmoestl@gmx.net> To: Kris Kennaway <kris@obsecurity.org> Cc: sparc64@FreeBSD.org Subject: Re: Package build in progress Message-ID: <20021113123958.GA1009@crow.dom2ip.de> In-Reply-To: <20021113111147.GA82735@rot13.obsecurity.org> References: <20021113111147.GA82735@rot13.obsecurity.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--pWyiEgJYm5f9v55/ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, 2002/11/13 at 03:11:48 -0800, Kris Kennaway wrote: > Thanks to the generous donation of a hard drive, I've started a new > sparc64 package build on my ultra 30..it should be finished in a > couple of weeks :) If it takes long to complete, could you please apply the two attached patches in src/contrib/binutils/bfd, rebuild and reinstall binutils an restart the build? Otherwise, some binaries (e.g. C++ libraries and binaries with very many externally defined functions) will be broken due to linker bugs. If this is going to be the final package run for DP2, it would be nice to avoid this. Both of these patches are already in the binutils CVS repository, and I hope that they will hit src/contrib soon. The third attached patch is required if you use kernel modules; it removes a workaround for one of the bugs, and requires a kernel module flag day (i.e. modules built with the old ld will not work with new kernels and vice versa). Thanks, - Thomas -- Thomas Moestl <tmoestl@gmx.net> http://www.tu-bs.de/~y0015675/ <tmm@FreeBSD.org> http://people.FreeBSD.org/~tmm/ PGP fingerprint: 1C97 A604 2BD0 E492 51D0 9C0F 1FE6 4F1D 419C 776C --pWyiEgJYm5f9v55/ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="bfd2-amodra.diff" Index: bfd/elf64-sparc.c =================================================================== RCS file: /cvs/src/src/bfd/elf64-sparc.c,v retrieving revision 1.60 diff -u -p -r1.60 elf64-sparc.c --- bfd/elf64-sparc.c 24 Sep 2002 15:54:22 -0000 1.60 +++ bfd/elf64-sparc.c 5 Nov 2002 04:19:52 -0000 @@ -2164,11 +2164,9 @@ sparc64_elf_relocate_section (output_bfd } else { + outrel.r_addend = relocation + rel->r_addend; if (r_type == R_SPARC_64) - { - outrel.r_info = ELF64_R_INFO (0, R_SPARC_RELATIVE); - outrel.r_addend = relocation + rel->r_addend; - } + outrel.r_info = ELF64_R_INFO (0, R_SPARC_RELATIVE); else { long indx; @@ -2198,6 +2196,13 @@ sparc64_elf_relocate_section (output_bfd osec = sec->output_section; indx = elf_section_data (osec)->dynindx; + /* We are turning this relocation into one + against a section symbol, so subtract out + the output section's address but not the + offset of the input section in the output + section. */ + outrel.r_addend -= osec->vma; + /* FIXME: we really should be able to link non-pic shared libraries. */ if (indx == 0) @@ -2216,7 +2221,6 @@ sparc64_elf_relocate_section (output_bfd ELF64_R_TYPE_INFO ( ELF64_R_TYPE_DATA (rel->r_info), r_type)); - outrel.r_addend = relocation + rel->r_addend; } } --pWyiEgJYm5f9v55/ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="bfd-hiplt.diff" Index: elf64-sparc.c =================================================================== RCS file: /d/ncvs/src/contrib/binutils/bfd/elf64-sparc.c,v retrieving revision 1.1.1.10 diff -u -r1.1.1.10 elf64-sparc.c --- elf64-sparc.c 11 Oct 2002 05:59:11 -0000 1.1.1.10 +++ elf64-sparc.c 9 Nov 2002 21:00:39 -0000 @@ -1563,6 +1563,9 @@ if (s->_raw_size == 0) s->_raw_size = PLT_HEADER_SIZE; + /* To simplify matters later, just store the plt index here. */ + h->plt.offset = s->_raw_size / PLT_ENTRY_SIZE; + /* If this symbol is not defined in a regular file, and we are not generating a shared library, then set the symbol to this location in the .plt. This is required to make function @@ -1572,12 +1575,9 @@ && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) { h->root.u.def.section = s; - h->root.u.def.value = s->_raw_size; + h->root.u.def.value = sparc64_elf_plt_entry_offset (h->plt.offset); } - /* To simplify matters later, just store the plt index here. */ - h->plt.offset = s->_raw_size / PLT_ENTRY_SIZE; - /* Make room for this entry. */ s->_raw_size += PLT_ENTRY_SIZE; --pWyiEgJYm5f9v55/ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="elf_machdep.diff" Index: sys/sparc64/sparc64/elf_machdep.c =================================================================== RCS file: /d/ncvs/src/sys/sparc64/sparc64/elf_machdep.c,v retrieving revision 1.11 diff -u -r1.11 elf_machdep.c --- sys/sparc64/sparc64/elf_machdep.c 19 Oct 2002 19:16:03 -0000 1.11 +++ sys/sparc64/sparc64/elf_machdep.c 13 Nov 2002 12:39:06 -0000 @@ -240,7 +240,6 @@ elf_reloc(linker_file_t lf, const void *data, int type) { const Elf_Rela *rela; - const Elf_Sym *sym; Elf_Addr relocbase; Elf_Half *where32; Elf_Addr *where; @@ -272,24 +271,10 @@ value = rela->r_addend; if (RELOC_RESOLVE_SYMBOL(rtype)) { - /* - * Work around what appears to be confusion between binutils - * and the v9 ABI. LO10 and HI22 relocations are listed as - * S + A, but for STB_LOCAL symbols it seems that the value - * in the Elf_Sym refered to by the symbol index is wrong, - * instead the value is in the addend field of the Elf_Rela - * record. So if the symbol is local don't look it up, just - * use the addend as its value and add in the relocbase. - */ - sym = elf_get_sym(lf, symidx); - if (ELF_ST_BIND(sym->st_info) == STB_LOCAL) - value += relocbase; - else { - addr = elf_lookup(lf, symidx, 1); - if (addr == 0) - return (-1); - value += addr; - } + addr = elf_lookup(lf, symidx, 1); + if (addr == 0) + return (-1); + value += addr; } if (RELOC_PC_RELATIVE(rtype)) --pWyiEgJYm5f9v55/-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-sparc" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021113123958.GA1009>