summaryrefslogtreecommitdiffstats
path: root/scripts/sortextable.c
diff options
context:
space:
mode:
authorJamie Iles <jamie.iles@oracle.com>2013-11-12 15:06:51 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2013-11-13 12:09:00 +0900
commit59c36455d061e200f386e1817362f6afd6265b6a (patch)
treeecaf2b9b1282e3ecc24198c56005f79a16740ad1 /scripts/sortextable.c
parenta2529ad9e5bed1935ac30cbe5b53de805485b171 (diff)
downloadlinux-stable-59c36455d061e200f386e1817362f6afd6265b6a.tar.gz
linux-stable-59c36455d061e200f386e1817362f6afd6265b6a.tar.bz2
linux-stable-59c36455d061e200f386e1817362f6afd6265b6a.zip
scripts/sortextable: support objects with more than 64K sections.
Building with a large config and -ffunction-sections results in a large number of sections and sortextable needs to be able to handle that. Implement support for > 64K sections as modpost does. Signed-off-by: Jamie Iles <jamie.iles@oracle.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Michal Marek <mmarek@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts/sortextable.c')
-rw-r--r--scripts/sortextable.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/scripts/sortextable.c b/scripts/sortextable.c
index 7c2310c5b996..5f7a8b663cb9 100644
--- a/scripts/sortextable.c
+++ b/scripts/sortextable.c
@@ -152,6 +152,30 @@ static void (*w2)(uint16_t, uint16_t *);
typedef void (*table_sort_t)(char *, int);
+/*
+ * Move reserved section indices SHN_LORESERVE..SHN_HIRESERVE out of
+ * the way to -256..-1, to avoid conflicting with real section
+ * indices.
+ */
+#define SPECIAL(i) ((i) - (SHN_HIRESERVE + 1))
+
+static inline int is_shndx_special(unsigned int i)
+{
+ return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE;
+}
+
+/* Accessor for sym->st_shndx, hides ugliness of "64k sections" */
+static inline unsigned int get_secindex(unsigned int shndx,
+ unsigned int sym_offs,
+ const Elf32_Word *symtab_shndx_start)
+{
+ if (is_shndx_special(shndx))
+ return SPECIAL(shndx);
+ if (shndx != SHN_XINDEX)
+ return shndx;
+ return r(&symtab_shndx_start[sym_offs]);
+}
+
/* 32 bit and 64 bit are very similar */
#include "sortextable.h"
#define SORTEXTABLE_64