Page MenuHomeFreeBSD

D609.id1117.diff
No OneTemporary

D609.id1117.diff

Index: sys/arm/arm/elf_machdep.c
===================================================================
--- sys/arm/arm/elf_machdep.c
+++ sys/arm/arm/elf_machdep.c
@@ -46,6 +46,8 @@
#include <machine/elf.h>
#include <machine/md_var.h>
+static boolean_t elf32_arm_check_abi(struct image_params *, const Elf_Ehdr *);
+
struct sysentvec elf32_freebsd_sysvec = {
.sv_size = SYS_MAXSYSCALL,
.sv_table = sysent,
@@ -90,7 +92,8 @@
.sysvec = &elf32_freebsd_sysvec,
.interp_newpath = NULL,
.brand_note = &elf32_freebsd_brandnote,
- .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+ .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE,
+ .check_header = elf32_arm_check_abi,
};
SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_FIRST,
@@ -107,12 +110,31 @@
.interp_newpath = NULL,
.brand_note = &elf32_freebsd_brandnote,
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+ .check_header = elf32_arm_check_abi,
};
SYSINIT(oelf32, SI_SUB_EXEC, SI_ORDER_ANY,
(sysinit_cfunc_t) elf32_insert_brand_entry,
&freebsd_brand_oinfo);
+static boolean_t
+elf32_arm_check_abi(struct image_params *imgp, const Elf_Ehdr *hdr)
+{
+#ifdef __ARM_EABI__
+ /*
+ * When configured for EABI, FreeBSD supports EABI vesions 4 and 5.
+ */
+ if (EF_ARM_EABI_VERSION(hdr->e_flags) < EF_ARM_EABI_FREEBSD_MIN)
+ return (FALSE);
+#else
+ /*
+ * When configured for OABI, that's all we do, so reject EABI binaries.
+ */
+ if (EF_ARM_EABI_VERSION(hdr->e_flags) != EF_ARM_EABI_VERSION_UNKNOWN)
+ return (FALSE);
+#endif
+ return (TRUE);
+}
void
elf32_dump_thread(struct thread *td __unused, void *dst __unused,
Index: sys/arm/include/elf.h
===================================================================
--- sys/arm/include/elf.h
+++ sys/arm/include/elf.h
@@ -103,6 +103,12 @@
#define ELF_TARG_MACH EM_ARM
#define ELF_TARG_VER 1
+/* Defines specific for arm headers */
+#define EF_ARM_EABIMASK 0xff000000
+#define EF_ARM_EABI_VERSION(x) (((x) & EF_ARM_EABIMASK) >> 24)
+#define EF_ARM_EABI_VERSION_UNKNOWN 0
+#define EF_ARM_EABI_FREEBSD_MIN 4
+
/*
* Magic number for the elf trampoline, chosen wisely to be an immediate
* value.
Index: sys/kern/imgact_elf.c
===================================================================
--- sys/kern/imgact_elf.c
+++ sys/kern/imgact_elf.c
@@ -294,6 +294,19 @@
return (bi);
}
+ /* No known brand, see if the header is recognized by any brand */
+ for (i = 0; i < MAX_BRANDS; i++) {
+ bi = elf_brand_list[i];
+ if (bi == NULL || bi->flags & BI_BRAND_NOTE_MANDATORY ||
+ bi->check_header == NULL)
+ continue;
+ if (hdr->e_machine == bi->machine) {
+ ret = bi->check_header(imgp, hdr);
+ if (ret)
+ return (bi);
+ }
+ }
+
/* Lacking a known brand, search for a recognized interpreter. */
if (interp != NULL) {
for (i = 0; i < MAX_BRANDS; i++) {
Index: sys/sys/imgact_elf.h
===================================================================
--- sys/sys/imgact_elf.h
+++ sys/sys/imgact_elf.h
@@ -74,6 +74,7 @@
const char *interp_newpath;
int flags;
Elf_Brandnote *brand_note;
+ boolean_t (*check_header)(struct image_params *, const Elf_Ehdr *);
#define BI_CAN_EXEC_DYN 0x0001
#define BI_BRAND_NOTE 0x0002 /* May have note.ABI-tag section. */
#define BI_BRAND_NOTE_MANDATORY 0x0004 /* Must have note.ABI-tag section. */

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 3, 5:07 AM (3 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40113964
Default Alt Text
D609.id1117.diff (3 KB)

Event Timeline