public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Anthony G. Basile" <blueness@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
Date: Tue,  6 Jan 2015 15:13:55 +0000 (UTC)	[thread overview]
Message-ID: <1420557296.c51a1996485f2836677d1a829e314e2a1fd85327.blueness@gentoo> (raw)

commit:     c51a1996485f2836677d1a829e314e2a1fd85327
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue Jan  6 15:14:56 2015 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue Jan  6 15:14:56 2015 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=c51a1996

misc/elf-abi: add logic for mips abis

---
 misc/elf-abi/elf-abi.c | 147 ++++++++++++++++++++++++++++---------------------
 1 file changed, 85 insertions(+), 62 deletions(-)

diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index 0a271ba..fb53391 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -7,25 +7,21 @@
  *
  * Supported identifiers:
  *
- *	alpha_{32,64}
- *	arm_{32,64}
- *	hppa_{32,64}
- *	ia_{32,64}
- *	m68k_{32,64}
+ *	alpha_64
+ *	arm_{oabi,eabi}
+ *	arm_64
+ *	hppa_32
+ *	ia_64
+ *	m68k_32
  *	mips_{n32,n64,o32}
  *	ppc_{32,64}
  *	s390_{32,64}
- *	sh_{32,64}
+ *	sh_32
  *	sparc_{32,64}
  *	x86_{32,x32,64}
  *
  * NOTES:
  *
- * * The ABIs referenced by some of the above *_32 and *_64 identifiers
- *   may be imaginary, but they are listed anyway, since the goal is to
- *   establish a naming convention that is as consistent and uniform as
- *   possible.
- *
  * * The Elf header's e_ident[EI_OSABI] byte is completely ignored,
  *   since OS-independence is one of the goals. The assumption is that,
  *   for given installation, we are only interested in tracking multilib
@@ -85,19 +81,13 @@
 #define EM_IA_64	50		/* Intel Merced */
 #define EM_X86_64	62		/* AMD x86-64 architecture */
 #define EM_AARCH64	183		/* ARM AARCH64 */
-#define EM_ALPHA	0x9026
+#define EM_ALPHA	0x9026		/* Unofficial, but needed in Gentoo */
+#define EM_HPPA		0x0F00		/* Unofficial, but needed in Gentoo */
 
-#define EF_MIPS_ABI2		32
-#define EF_MIPS_ABI_ON32	64
-/*
-E_MIPS_ABI_O32     = 0x00001000
-E_MIPS_ABI_O64     = 0x00002000
-E_MIPS_ABI_EABI32  = 0x00003000
-E_MIPS_ABI_EABI64  = 0x00004000
-*/
+#define EF_MIPS_ABI		0x0000F000
+#define E_MIPS_ABI_O32		0x00001000
 
-#define EF_ARM_NEW_ABI		0x80
-#define EF_ARM_OLD_ABI		0x100
+#define EF_ARM_EABIMASK		0XFF000000
 
 
 int
@@ -117,44 +107,100 @@ get_wordsize(uint8_t ei_class)
 char *
 get_abi(uint16_t e_machine, int width, uint32_t e_flags)
 {
+	/* The following arrives at the abstract ABI name by a process of elimination based on the assumption
+	 * that we are only interested in the ABIs supported in Gentoo.  If a new ABIs is added, you need to
+	 * rethink the logic to avoid false positives/negatives.
+	 */
 	switch(e_machine) {
+
+		/* alpha: We support only one 64-bit ABI. */
 		case EM_ALPHA:
 		case EM_FAKE_ALPHA:
-			return "alpha";
+			return "alpha_64";
+
+		/* amd64 + x86: We support X86-64, X86-X32, and X86-32 ABI. The first
+		 * two are 64-bit ABIs and the third is 32-bit.  All three will run on
+		 * amd64 architecture, but only the 32-bit will run on the x86 family.
+		 */
 		case EM_X86_64:
-			return "amd64";
+			if (width == 64)
+				return "x86_64";
+			else
+				return "x86_x32";
+		case EM_386:
+			return "x86_32";
+
+		/* arm: We support two 32-bit ABIs, eabi and oabi. */
 		case EM_ARM:
-			return "arm";
+			if (e_flags & EF_ARM_EABIMASK)
+				return "arm_eabi";
+			else
+				return "arm_oabi";
+
+		/* arm64: We support only one 64-bit ABI. */
 		case EM_AARCH64:
-			return "arm64";
+			return "arm_64";
+
+		/* m68k: We support only one 32-bit ABI. */
 		case EM_68K:
-			return "m68k";
+			return "m68k_32";
+
+		/* mips: We support o32, n32 and n64.  The first is 32-bits and the
+		 * latter two are 64-bit ABIs.
+		 */
 		case EM_MIPS_RS3_LE:
 		case EM_MIPS:
-			return "mips";
+			if (width == 64)
+				return "mips_n64";
+			else
+				if ((e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
+					return "mips_o32";
+				else
+					return "mips_n32";
+
+		/* ia64: We support only one 64-bit ABI. */
 		case EM_IA_64:
-			return "ia64";
+			return "ia_64";
+
+		/* hppa: We support only one 32-bit ABI. */
 		case EM_PARISC:
-			return "hppa";
+		case EM_HPPA:
+			return "hppa_32";
+
+		/* ppc: We support only one 32-bit ABI. */
 		case EM_PPC:
-			return "ppc";
+			return "ppc_32";
+
+		/* ppc64: We support only one 64-bit ABI. */
 		case EM_PPC64:
-			return "ppc64";
+			return "ppc_64";
+
+		/* s390: We support one 32-bit and one 64-bit ABI. */
 		case EM_S390:
-			return "s390";
+			if (width == 64)
+				return "s390_64";
+			else
+				return "s390_32";
+
+		/* sh: We support only one 32-bit ABI. */
 		case EM_SH:
-			return "sh";
+			return "sh_32";
+
+		/* sparc: We support one 32-bit and one 64-bit ABI. */
 		case EM_SPARC32PLUS:
 		case EM_SPARCV9:
 		case EM_SPARC:
-			return "sparc";
-		case EM_386:
-			return "x86";
+			if (width == 64)
+				return "sparc_64";
+			else
+				return "sparc_32";
+
 		default:
-			return "unknown_arch";
+			return "unknown";
 	}
 }
 
+
 int
 main(int argc, char* argv[])
 {
@@ -218,35 +264,12 @@ main(int argc, char* argv[])
 
 	if (lseek(fd, e_flags_offset, SEEK_SET) == -1)
 		err(1, "lseek() e_flags failed");
-	if (read(fd, &e_flags, 2) == -1)
+	if (read(fd, &e_flags, 4) == -1)
 		err(1, "read() e_flags failed");
 
 	abi = get_abi(e_machine, width, e_flags);
-
 	printf("%s\n", abi);
 
-
-/*
-	if (!strcmp(arch, "mips")) ;
-		switch (e_flags & EF_MIPS_ABI) {
-			case E_MIPS_ABI_O32:
-				abi = "o32";
-				break;
-
-		if mips_abi == E_MIPS_ABI_O32:
-			name = "o32"
-		elif mips_abi == E_MIPS_ABI_O64:
-			name = "o64"
-		elif mips_abi == E_MIPS_ABI_EABI32:
-			name = "eabi32"
-		elif mips_abi == E_MIPS_ABI_EABI64:
-			name = "eabi64"
-	elif elf_header.e_flags & EF_MIPS_ABI2:
-		name = "n32"
-	elif elf_header.ei_class == ELFCLASS64:
-		name = "n64"
-		}
-*/
 	close(fd);
 	exit(EXIT_SUCCESS);
 }


             reply	other threads:[~2015-01-06 15:14 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-06 15:13 Anthony G. Basile [this message]
  -- strict thread matches above, loose matches on Subject: below --
2015-01-06 21:43 [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/ Anthony G. Basile
2015-01-06 21:34 Anthony G. Basile
2015-01-06 20:47 Anthony G. Basile
2015-01-06 18:22 Anthony G. Basile
2015-01-06 17:26 Anthony G. Basile
2015-01-05 16:26 Anthony G. Basile
2015-01-05 16:23 Anthony G. Basile
2015-01-03 23:53 Anthony G. Basile
2015-01-03 23:49 Anthony G. Basile
2015-01-03 23:19 Anthony G. Basile

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1420557296.c51a1996485f2836677d1a829e314e2a1fd85327.blueness@gentoo \
    --to=blueness@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox