Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
Pull kbuild updates from Michal Marek: - prototypes for x86 asm-exported symbols (Adam Borowski) and a warning about missing CRCs (Nick Piggin) - asm-exports fix for LTO (Nicolas Pitre) - thin archives improvements (Nick Piggin) - linker script fix for CONFIG_LD_DEAD_CODE_DATA_ELIMINATION (Nick Piggin) - genksyms support for __builtin_va_list keyword - misc minor fixes * 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild: x86/kbuild: enable modversions for symbols exported from asm kbuild: fix scripts/adjust_autoksyms.sh* for the no modules case scripts/kallsyms: remove last remnants of --page-offset option make use of make variable CURDIR instead of calling pwd kbuild: cmd_export_list: tighten the sed script kbuild: minor improvement for thin archives build kbuild: modpost warn if export version crc is missing kbuild: keep data tables through dead code elimination kbuild: improve linker compatibility with lib-ksyms.o build genksyms: Regenerate parser kbuild/genksyms: handle va_list type kbuild: thin archives for multi-y targets kbuild: kallsyms allow 3-pass generation if symbols size has changed
This commit is contained in:
+12
-5
@@ -488,9 +488,9 @@ endif
|
||||
|
||||
quiet_cmd_export_list = EXPORTS $@
|
||||
cmd_export_list = $(OBJDUMP) -h $< | \
|
||||
sed -ne '/___ksymtab/{s/.*+/$(ref_prefix)/;s/ .*/)/;p}' >$(ksyms-lds);\
|
||||
sed -ne '/___ksymtab/s/.*+\([^ ]*\).*/$(ref_prefix)\1)/p' >$(ksyms-lds);\
|
||||
rm -f $(dummy-object);\
|
||||
$(AR) rcs$(KBUILD_ARFLAGS) $(dummy-object);\
|
||||
echo | $(CC) $(a_flags) -c -o $(dummy-object) -x assembler -;\
|
||||
$(LD) $(ld_flags) -r -o $@ -T $(ksyms-lds) $(dummy-object);\
|
||||
rm $(dummy-object) $(ksyms-lds)
|
||||
|
||||
@@ -517,11 +517,18 @@ $($(subst $(obj)/,,$(@:.o=-objs))) \
|
||||
$($(subst $(obj)/,,$(@:.o=-y))) \
|
||||
$($(subst $(obj)/,,$(@:.o=-m)))), $^)
|
||||
|
||||
quiet_cmd_link_multi-y = LD $@
|
||||
cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
|
||||
cmd_link_multi-link = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
|
||||
|
||||
ifdef CONFIG_THIN_ARCHIVES
|
||||
quiet_cmd_link_multi-y = AR $@
|
||||
cmd_link_multi-y = rm -f $@; $(AR) rcST$(KBUILD_ARFLAGS) $@ $(link_multi_deps)
|
||||
else
|
||||
quiet_cmd_link_multi-y = LD $@
|
||||
cmd_link_multi-y = $(cmd_link_multi-link)
|
||||
endif
|
||||
|
||||
quiet_cmd_link_multi-m = LD [M] $@
|
||||
cmd_link_multi-m = $(cmd_link_multi-y)
|
||||
cmd_link_multi-m = $(cmd_link_multi-link)
|
||||
|
||||
$(multi-used-y): FORCE
|
||||
$(call if_changed,link_multi-y)
|
||||
|
||||
@@ -59,6 +59,7 @@ cat > "$new_ksyms_file" << EOT
|
||||
*/
|
||||
|
||||
EOT
|
||||
[ "$(ls -A "$MODVERDIR")" ] &&
|
||||
sed -ns -e '3{s/ /\n/g;/^$/!p;}' "$MODVERDIR"/*.mod | sort -u |
|
||||
while read sym; do
|
||||
if [ -n "$CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX" ]; then
|
||||
|
||||
@@ -27,6 +27,7 @@ __typeof, TYPEOF_KEYW
|
||||
__typeof__, TYPEOF_KEYW
|
||||
__volatile, VOLATILE_KEYW
|
||||
__volatile__, VOLATILE_KEYW
|
||||
__builtin_va_list, VA_LIST_KEYW
|
||||
# According to rth, c99 defines _Bool, __restrict, __restrict__, restrict. KAO
|
||||
_Bool, BOOL_KEYW
|
||||
_restrict, RESTRICT_KEYW
|
||||
|
||||
@@ -57,7 +57,7 @@ is_reserved_hash (register const char *str, register unsigned int len)
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 0,
|
||||
101, 101, 101, 101, 101, 101, 15, 101, 101, 101,
|
||||
0, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 0, 101, 0, 101, 5,
|
||||
101, 101, 101, 101, 101, 0, 101, 0, 0, 5,
|
||||
25, 20, 55, 30, 101, 15, 101, 101, 10, 0,
|
||||
10, 40, 10, 101, 10, 5, 0, 10, 15, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
@@ -89,7 +89,7 @@ is_reserved_word (register const char *str, register unsigned int len)
|
||||
{
|
||||
enum
|
||||
{
|
||||
TOTAL_KEYWORDS = 46,
|
||||
TOTAL_KEYWORDS = 47,
|
||||
MIN_WORD_LENGTH = 3,
|
||||
MAX_WORD_LENGTH = 24,
|
||||
MIN_HASH_VALUE = 3,
|
||||
@@ -99,7 +99,7 @@ is_reserved_word (register const char *str, register unsigned int len)
|
||||
static const struct resword wordlist[] =
|
||||
{
|
||||
{""}, {""}, {""},
|
||||
#line 35 "scripts/genksyms/keywords.gperf"
|
||||
#line 36 "scripts/genksyms/keywords.gperf"
|
||||
{"asm", ASM_KEYW},
|
||||
{""},
|
||||
#line 15 "scripts/genksyms/keywords.gperf"
|
||||
@@ -119,20 +119,21 @@ is_reserved_word (register const char *str, register unsigned int len)
|
||||
{"__const__", CONST_KEYW},
|
||||
#line 25 "scripts/genksyms/keywords.gperf"
|
||||
{"__signed__", SIGNED_KEYW},
|
||||
#line 53 "scripts/genksyms/keywords.gperf"
|
||||
{"static", STATIC_KEYW},
|
||||
{""},
|
||||
#line 48 "scripts/genksyms/keywords.gperf"
|
||||
{"int", INT_KEYW},
|
||||
#line 41 "scripts/genksyms/keywords.gperf"
|
||||
{"char", CHAR_KEYW},
|
||||
#line 42 "scripts/genksyms/keywords.gperf"
|
||||
{"const", CONST_KEYW},
|
||||
#line 54 "scripts/genksyms/keywords.gperf"
|
||||
{"static", STATIC_KEYW},
|
||||
#line 30 "scripts/genksyms/keywords.gperf"
|
||||
{"__builtin_va_list", VA_LIST_KEYW},
|
||||
#line 49 "scripts/genksyms/keywords.gperf"
|
||||
{"int", INT_KEYW},
|
||||
#line 42 "scripts/genksyms/keywords.gperf"
|
||||
{"char", CHAR_KEYW},
|
||||
#line 43 "scripts/genksyms/keywords.gperf"
|
||||
{"const", CONST_KEYW},
|
||||
#line 55 "scripts/genksyms/keywords.gperf"
|
||||
{"struct", STRUCT_KEYW},
|
||||
#line 33 "scripts/genksyms/keywords.gperf"
|
||||
{"__restrict__", RESTRICT_KEYW},
|
||||
#line 34 "scripts/genksyms/keywords.gperf"
|
||||
{"__restrict__", RESTRICT_KEYW},
|
||||
#line 35 "scripts/genksyms/keywords.gperf"
|
||||
{"restrict", RESTRICT_KEYW},
|
||||
#line 12 "scripts/genksyms/keywords.gperf"
|
||||
{"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
|
||||
@@ -143,7 +144,7 @@ is_reserved_word (register const char *str, register unsigned int len)
|
||||
{"__volatile__", VOLATILE_KEYW},
|
||||
#line 10 "scripts/genksyms/keywords.gperf"
|
||||
{"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
|
||||
#line 32 "scripts/genksyms/keywords.gperf"
|
||||
#line 33 "scripts/genksyms/keywords.gperf"
|
||||
{"_restrict", RESTRICT_KEYW},
|
||||
{""},
|
||||
#line 17 "scripts/genksyms/keywords.gperf"
|
||||
@@ -152,64 +153,64 @@ is_reserved_word (register const char *str, register unsigned int len)
|
||||
{"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
|
||||
#line 21 "scripts/genksyms/keywords.gperf"
|
||||
{"__extension__", EXTENSION_KEYW},
|
||||
#line 44 "scripts/genksyms/keywords.gperf"
|
||||
#line 45 "scripts/genksyms/keywords.gperf"
|
||||
{"enum", ENUM_KEYW},
|
||||
#line 13 "scripts/genksyms/keywords.gperf"
|
||||
{"EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW},
|
||||
#line 45 "scripts/genksyms/keywords.gperf"
|
||||
#line 46 "scripts/genksyms/keywords.gperf"
|
||||
{"extern", EXTERN_KEYW},
|
||||
{""},
|
||||
#line 24 "scripts/genksyms/keywords.gperf"
|
||||
{"__signed", SIGNED_KEYW},
|
||||
#line 14 "scripts/genksyms/keywords.gperf"
|
||||
{"EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
|
||||
#line 57 "scripts/genksyms/keywords.gperf"
|
||||
#line 58 "scripts/genksyms/keywords.gperf"
|
||||
{"union", UNION_KEYW},
|
||||
{""}, {""},
|
||||
#line 22 "scripts/genksyms/keywords.gperf"
|
||||
{"__inline", INLINE_KEYW},
|
||||
#line 40 "scripts/genksyms/keywords.gperf"
|
||||
#line 41 "scripts/genksyms/keywords.gperf"
|
||||
{"auto", AUTO_KEYW},
|
||||
#line 28 "scripts/genksyms/keywords.gperf"
|
||||
{"__volatile", VOLATILE_KEYW},
|
||||
{""}, {""},
|
||||
#line 58 "scripts/genksyms/keywords.gperf"
|
||||
#line 59 "scripts/genksyms/keywords.gperf"
|
||||
{"unsigned", UNSIGNED_KEYW},
|
||||
{""},
|
||||
#line 51 "scripts/genksyms/keywords.gperf"
|
||||
#line 52 "scripts/genksyms/keywords.gperf"
|
||||
{"short", SHORT_KEYW},
|
||||
#line 47 "scripts/genksyms/keywords.gperf"
|
||||
#line 48 "scripts/genksyms/keywords.gperf"
|
||||
{"inline", INLINE_KEYW},
|
||||
{""},
|
||||
#line 60 "scripts/genksyms/keywords.gperf"
|
||||
#line 61 "scripts/genksyms/keywords.gperf"
|
||||
{"volatile", VOLATILE_KEYW},
|
||||
#line 49 "scripts/genksyms/keywords.gperf"
|
||||
#line 50 "scripts/genksyms/keywords.gperf"
|
||||
{"long", LONG_KEYW},
|
||||
#line 31 "scripts/genksyms/keywords.gperf"
|
||||
#line 32 "scripts/genksyms/keywords.gperf"
|
||||
{"_Bool", BOOL_KEYW},
|
||||
{""}, {""},
|
||||
#line 50 "scripts/genksyms/keywords.gperf"
|
||||
#line 51 "scripts/genksyms/keywords.gperf"
|
||||
{"register", REGISTER_KEYW},
|
||||
#line 59 "scripts/genksyms/keywords.gperf"
|
||||
#line 60 "scripts/genksyms/keywords.gperf"
|
||||
{"void", VOID_KEYW},
|
||||
{""},
|
||||
#line 43 "scripts/genksyms/keywords.gperf"
|
||||
#line 44 "scripts/genksyms/keywords.gperf"
|
||||
{"double", DOUBLE_KEYW},
|
||||
{""},
|
||||
#line 26 "scripts/genksyms/keywords.gperf"
|
||||
{"__typeof", TYPEOF_KEYW},
|
||||
{""}, {""},
|
||||
#line 52 "scripts/genksyms/keywords.gperf"
|
||||
#line 53 "scripts/genksyms/keywords.gperf"
|
||||
{"signed", SIGNED_KEYW},
|
||||
{""}, {""}, {""}, {""},
|
||||
#line 56 "scripts/genksyms/keywords.gperf"
|
||||
#line 57 "scripts/genksyms/keywords.gperf"
|
||||
{"typeof", TYPEOF_KEYW},
|
||||
#line 55 "scripts/genksyms/keywords.gperf"
|
||||
#line 56 "scripts/genksyms/keywords.gperf"
|
||||
{"typedef", TYPEDEF_KEYW},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 46 "scripts/genksyms/keywords.gperf"
|
||||
#line 47 "scripts/genksyms/keywords.gperf"
|
||||
{"float", FLOAT_KEYW}
|
||||
};
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -72,22 +72,23 @@ extern int yydebug;
|
||||
VOID_KEYW = 281,
|
||||
VOLATILE_KEYW = 282,
|
||||
TYPEOF_KEYW = 283,
|
||||
EXPORT_SYMBOL_KEYW = 284,
|
||||
ASM_PHRASE = 285,
|
||||
ATTRIBUTE_PHRASE = 286,
|
||||
TYPEOF_PHRASE = 287,
|
||||
BRACE_PHRASE = 288,
|
||||
BRACKET_PHRASE = 289,
|
||||
EXPRESSION_PHRASE = 290,
|
||||
CHAR = 291,
|
||||
DOTS = 292,
|
||||
IDENT = 293,
|
||||
INT = 294,
|
||||
REAL = 295,
|
||||
STRING = 296,
|
||||
TYPE = 297,
|
||||
OTHER = 298,
|
||||
FILENAME = 299
|
||||
VA_LIST_KEYW = 284,
|
||||
EXPORT_SYMBOL_KEYW = 285,
|
||||
ASM_PHRASE = 286,
|
||||
ATTRIBUTE_PHRASE = 287,
|
||||
TYPEOF_PHRASE = 288,
|
||||
BRACE_PHRASE = 289,
|
||||
BRACKET_PHRASE = 290,
|
||||
EXPRESSION_PHRASE = 291,
|
||||
CHAR = 292,
|
||||
DOTS = 293,
|
||||
IDENT = 294,
|
||||
INT = 295,
|
||||
REAL = 296,
|
||||
STRING = 297,
|
||||
TYPE = 298,
|
||||
OTHER = 299,
|
||||
FILENAME = 300
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -98,6 +98,7 @@ static void record_compound(struct string_list **keyw,
|
||||
%token VOID_KEYW
|
||||
%token VOLATILE_KEYW
|
||||
%token TYPEOF_KEYW
|
||||
%token VA_LIST_KEYW
|
||||
|
||||
%token EXPORT_SYMBOL_KEYW
|
||||
|
||||
@@ -261,6 +262,7 @@ simple_type_specifier:
|
||||
| DOUBLE_KEYW
|
||||
| VOID_KEYW
|
||||
| BOOL_KEYW
|
||||
| VA_LIST_KEYW
|
||||
| TYPE { (*$1)->tag = SYM_TYPEDEF; $$ = $1; }
|
||||
;
|
||||
|
||||
|
||||
@@ -76,7 +76,6 @@ static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: kallsyms [--all-symbols] "
|
||||
"[--symbol-prefix=<prefix char>] "
|
||||
"[--page-offset=<CONFIG_PAGE_OFFSET>] "
|
||||
"[--base-relative] < in.map > out.S\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
+22
-15
@@ -209,15 +209,6 @@ case "${KCONFIG_CONFIG}" in
|
||||
. "./${KCONFIG_CONFIG}"
|
||||
esac
|
||||
|
||||
archive_builtin
|
||||
|
||||
#link vmlinux.o
|
||||
info LD vmlinux.o
|
||||
modpost_link vmlinux.o
|
||||
|
||||
# modpost vmlinux.o to check for section mismatches
|
||||
${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
|
||||
|
||||
# Update version
|
||||
info GEN .version
|
||||
if [ ! -r .version ]; then
|
||||
@@ -231,6 +222,15 @@ fi;
|
||||
# final build of init/
|
||||
${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init GCC_PLUGINS_CFLAGS="${GCC_PLUGINS_CFLAGS}"
|
||||
|
||||
archive_builtin
|
||||
|
||||
#link vmlinux.o
|
||||
info LD vmlinux.o
|
||||
modpost_link vmlinux.o
|
||||
|
||||
# modpost vmlinux.o to check for section mismatches
|
||||
${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
|
||||
|
||||
kallsymso=""
|
||||
kallsyms_vmlinux=""
|
||||
if [ -n "${CONFIG_KALLSYMS}" ]; then
|
||||
@@ -246,10 +246,14 @@ if [ -n "${CONFIG_KALLSYMS}" ]; then
|
||||
# the right size, but due to the added section, some
|
||||
# addresses have shifted.
|
||||
# From here, we generate a correct .tmp_kallsyms2.o
|
||||
# 2a) We may use an extra pass as this has been necessary to
|
||||
# woraround some alignment related bugs.
|
||||
# KALLSYMS_EXTRA_PASS=1 is used to trigger this.
|
||||
# 3) The correct ${kallsymso} is linked into the final vmlinux.
|
||||
# 3) That link may have expanded the kernel image enough that
|
||||
# more linker branch stubs / trampolines had to be added, which
|
||||
# introduces new names, which further expands kallsyms. Do another
|
||||
# pass if that is the case. In theory it's possible this results
|
||||
# in even more stubs, but unlikely.
|
||||
# KALLSYMS_EXTRA_PASS=1 may also used to debug or work around
|
||||
# other bugs.
|
||||
# 4) The correct ${kallsymso} is linked into the final vmlinux.
|
||||
#
|
||||
# a) Verify that the System.map from vmlinux matches the map from
|
||||
# ${kallsymso}.
|
||||
@@ -265,8 +269,11 @@ if [ -n "${CONFIG_KALLSYMS}" ]; then
|
||||
vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2
|
||||
kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o
|
||||
|
||||
# step 2a
|
||||
if [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
|
||||
# step 3
|
||||
size1=$(stat -c "%s" .tmp_kallsyms1.o)
|
||||
size2=$(stat -c "%s" .tmp_kallsyms2.o)
|
||||
|
||||
if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
|
||||
kallsymso=.tmp_kallsyms3.o
|
||||
kallsyms_vmlinux=.tmp_vmlinux3
|
||||
|
||||
|
||||
@@ -609,6 +609,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
|
||||
{
|
||||
unsigned int crc;
|
||||
enum export export;
|
||||
bool is_crc = false;
|
||||
|
||||
if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
|
||||
strncmp(symname, "__ksymtab", 9) == 0)
|
||||
@@ -618,6 +619,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
|
||||
|
||||
/* CRC'd symbol */
|
||||
if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) {
|
||||
is_crc = true;
|
||||
crc = (unsigned int) sym->st_value;
|
||||
sym_update_crc(symname + strlen(CRC_PFX), mod, crc,
|
||||
export);
|
||||
@@ -663,6 +665,10 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
|
||||
else
|
||||
symname++;
|
||||
#endif
|
||||
if (is_crc) {
|
||||
const char *e = is_vmlinux(mod->name) ?"":".ko";
|
||||
warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n", symname + strlen(CRC_PFX), mod->name, e);
|
||||
}
|
||||
mod->unres = alloc_symbol(symname,
|
||||
ELF_ST_BIND(sym->st_info) == STB_WEAK,
|
||||
mod->unres);
|
||||
|
||||
Reference in New Issue
Block a user