Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F167954198
D15734.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D15734.id.diff
View Options
Index: head/contrib/elftoolchain/elfcopy/main.c
===================================================================
--- head/contrib/elftoolchain/elfcopy/main.c
+++ head/contrib/elftoolchain/elfcopy/main.c
@@ -372,6 +372,14 @@
create_symtab(ecp);
/*
+ * Write the underlying ehdr. Note that it should be called
+ * before elf_setshstrndx() since it will overwrite e->e_shstrndx.
+ */
+ if (gelf_update_ehdr(ecp->eout, &oeh) == 0)
+ errx(EXIT_FAILURE, "gelf_update_ehdr() failed: %s",
+ elf_errmsg(-1));
+
+ /*
* First processing of output sections: at this stage we copy the
* content of each section from input to output object. Section
* content will be modified and printed (mcs) if need. Also content of
@@ -379,14 +387,6 @@
* to symbol table changes.
*/
copy_content(ecp);
-
- /*
- * Write the underlying ehdr. Note that it should be called
- * before elf_setshstrndx() since it will overwrite e->e_shstrndx.
- */
- if (gelf_update_ehdr(ecp->eout, &oeh) == 0)
- errx(EXIT_FAILURE, "gelf_update_ehdr() failed: %s",
- elf_errmsg(-1));
/* Generate section name string table (.shstrtab). */
set_shstrtab(ecp);
Index: head/contrib/elftoolchain/libelf/Makefile
===================================================================
--- head/contrib/elftoolchain/libelf/Makefile
+++ head/contrib/elftoolchain/libelf/Makefile
@@ -35,6 +35,7 @@
gelf_ehdr.c \
gelf_getclass.c \
gelf_fsize.c \
+ gelf_mips64el.c \
gelf_move.c \
gelf_phdr.c \
gelf_rel.c \
Index: head/contrib/elftoolchain/libelf/_libelf.h
===================================================================
--- head/contrib/elftoolchain/libelf/_libelf.h
+++ head/contrib/elftoolchain/libelf/_libelf.h
@@ -216,12 +216,15 @@
void *_libelf_getphdr(Elf *_e, int _elfclass);
void *_libelf_getshdr(Elf_Scn *_scn, int _elfclass);
void _libelf_init_elf(Elf *_e, Elf_Kind _kind);
+int _libelf_is_mips64el(Elf *e);
int _libelf_load_section_headers(Elf *e, void *ehdr);
unsigned int _libelf_malign(Elf_Type _t, int _elfclass);
Elf *_libelf_memory(unsigned char *_image, size_t _sz, int _reporterror);
size_t _libelf_msize(Elf_Type _t, int _elfclass, unsigned int _version);
void *_libelf_newphdr(Elf *_e, int _elfclass, size_t _count);
Elf *_libelf_open_object(int _fd, Elf_Cmd _c, int _reporterror);
+Elf64_Xword _libelf_mips64el_r_info_tof(Elf64_Xword r_info);
+Elf64_Xword _libelf_mips64el_r_info_tom(Elf64_Xword r_info);
struct _Libelf_Data *_libelf_release_data(struct _Libelf_Data *_d);
Elf *_libelf_release_elf(Elf *_e);
Elf_Scn *_libelf_release_scn(Elf_Scn *_s);
Index: head/contrib/elftoolchain/libelf/gelf_mips64el.c
===================================================================
--- head/contrib/elftoolchain/libelf/gelf_mips64el.c
+++ head/contrib/elftoolchain/libelf/gelf_mips64el.c
@@ -0,0 +1,81 @@
+/*-
+ * Copyright (c) 2018 John Baldwin
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <gelf.h>
+
+#include "_libelf.h"
+
+ELFTC_VCSID("$Id$");
+
+int
+_libelf_is_mips64el(Elf *e)
+{
+
+ return (e->e_kind == ELF_K_ELF && e->e_byteorder == ELFDATA2LSB &&
+ e->e_u.e_elf.e_ehdr.e_ehdr64->e_machine == EM_MIPS);
+}
+
+/*
+ * For MIPS64, the r_info field is actually stored as a 32-bit symbol
+ * index (r_sym) followed by four single-byte fields (r_ssym, r_type3,
+ * r_type2, and r_type). The byte-swap for the little-endian case
+ * jumbles this incorrectly so compensate.
+ */
+Elf64_Xword
+_libelf_mips64el_r_info_tof(Elf64_Xword r_info)
+{
+ Elf64_Xword new_info;
+ uint8_t ssym, type3, type2, type;
+
+ ssym = r_info >> 24;
+ type3 = r_info >> 16;
+ type2 = r_info >> 8;
+ type = r_info;
+ new_info = r_info >> 32;
+ new_info |= (Elf64_Xword)ssym << 32;
+ new_info |= (Elf64_Xword)type3 << 40;
+ new_info |= (Elf64_Xword)type2 << 48;
+ new_info |= (Elf64_Xword)type << 56;
+ return (new_info);
+}
+
+Elf64_Xword
+_libelf_mips64el_r_info_tom(Elf64_Xword r_info)
+{
+ Elf64_Xword new_info;
+ uint8_t ssym, type3, type2, type;
+
+ ssym = r_info >> 32;
+ type3 = r_info >> 40;
+ type2 = r_info >> 48;
+ type = r_info >> 56;
+ new_info = (r_info & 0xffffffff) << 32;
+ new_info |= (Elf64_Xword)ssym << 24;
+ new_info |= (Elf64_Xword)type3 << 16;
+ new_info |= (Elf64_Xword)type2 << 8;
+ new_info |= (Elf64_Xword)type;
+ return (new_info);
+}
Index: head/contrib/elftoolchain/libelf/gelf_rel.c
===================================================================
--- head/contrib/elftoolchain/libelf/gelf_rel.c
+++ head/contrib/elftoolchain/libelf/gelf_rel.c
@@ -90,6 +90,9 @@
rel64 = (Elf64_Rel *) d->d_data.d_buf + ndx;
*dst = *rel64;
+
+ if (_libelf_is_mips64el(e))
+ dst->r_info = _libelf_mips64el_r_info_tom(rel64->r_info);
}
return (dst);
@@ -156,6 +159,9 @@
rel64 = (Elf64_Rel *) d->d_data.d_buf + ndx;
*rel64 = *dr;
+
+ if (_libelf_is_mips64el(e))
+ rel64->r_info = _libelf_mips64el_r_info_tof(dr->r_info);
}
return (1);
Index: head/contrib/elftoolchain/libelf/gelf_rela.c
===================================================================
--- head/contrib/elftoolchain/libelf/gelf_rela.c
+++ head/contrib/elftoolchain/libelf/gelf_rela.c
@@ -91,6 +91,10 @@
rela64 = (Elf64_Rela *) d->d_data.d_buf + ndx;
*dst = *rela64;
+
+ if (_libelf_is_mips64el(e))
+ dst->r_info =
+ _libelf_mips64el_r_info_tom(rela64->r_info);
}
return (dst);
@@ -159,6 +163,9 @@
rela64 = (Elf64_Rela *) d->d_data.d_buf + ndx;
*rela64 = *dr;
+
+ if (_libelf_is_mips64el(e))
+ rela64->r_info = _libelf_mips64el_r_info_tof(dr->r_info);
}
return (1);
Index: head/sys/sys/param.h
===================================================================
--- head/sys/sys/param.h
+++ head/sys/sys/param.h
@@ -60,7 +60,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1200083 /* Master, propagated to newvers */
+#define __FreeBSD_version 1200084 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Aug 26, 2:54 PM (4 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37239587
Default Alt Text
D15734.id.diff (7 KB)
Attached To
Mode
D15734: Fix objcopy for little-endian MIPS64 objects.
Attached
Detach File
Event Timeline
Log In to Comment