Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
Pull kbuild updates from Michal Marek: - EXPORT_SYMBOL for asm source by Al Viro. This does bring a regression, because genksyms no longer generates checksums for these symbols (CONFIG_MODVERSIONS). Nick Piggin is working on a patch to fix this. Plus, we are talking about functions like strcpy(), which rarely change prototypes. - Fixes for PPC fallout of the above by Stephen Rothwell and Nick Piggin - fixdep speedup by Alexey Dobriyan. - preparatory work by Nick Piggin to allow architectures to build with -ffunction-sections, -fdata-sections and --gc-sections - CONFIG_THIN_ARCHIVES support by Stephen Rothwell - fix for filenames with colons in the initramfs source by me. * 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild: (22 commits) initramfs: Escape colons in depfile ppc: there is no clear_pages to export powerpc/64: whitelist unresolved modversions CRCs kbuild: -ffunction-sections fix for archs with conflicting sections kbuild: add arch specific post-link Makefile kbuild: allow archs to select link dead code/data elimination kbuild: allow architectures to use thin archives instead of ld -r kbuild: Regenerate genksyms lexer kbuild: genksyms fix for typeof handling fixdep: faster CONFIG_ search ia64: move exports to definitions sparc32: debride memcpy.S a bit [sparc] unify 32bit and 64bit string.h sparc: move exports to definitions ppc: move exports to definitions arm: move exports to definitions s390: move exports to definitions m68k: move exports to definitions alpha: move exports to actual definitions x86: move exports to actual definitions ...
This commit is contained in:
@@ -81,6 +81,7 @@ endif
|
||||
|
||||
ifneq ($(strip $(lib-y) $(lib-m) $(lib-)),)
|
||||
lib-target := $(obj)/lib.a
|
||||
obj-y += $(obj)/lib-ksyms.o
|
||||
endif
|
||||
|
||||
ifneq ($(strip $(obj-y) $(obj-m) $(obj-) $(subdir-m) $(lib-target)),)
|
||||
@@ -358,12 +359,22 @@ $(sort $(subdir-obj-y)): $(subdir-ym) ;
|
||||
# Rule to compile a set of .o files into one .o file
|
||||
#
|
||||
ifdef builtin-target
|
||||
quiet_cmd_link_o_target = LD $@
|
||||
|
||||
ifdef CONFIG_THIN_ARCHIVES
|
||||
cmd_make_builtin = rm -f $@; $(AR) rcST$(KBUILD_ARFLAGS)
|
||||
cmd_make_empty_builtin = rm -f $@; $(AR) rcST$(KBUILD_ARFLAGS)
|
||||
quiet_cmd_link_o_target = AR $@
|
||||
else
|
||||
cmd_make_builtin = $(LD) $(ld_flags) -r -o
|
||||
cmd_make_empty_builtin = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS)
|
||||
quiet_cmd_link_o_target = LD $@
|
||||
endif
|
||||
|
||||
# If the list of objects to link is empty, just create an empty built-in.o
|
||||
cmd_link_o_target = $(if $(strip $(obj-y)),\
|
||||
$(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
|
||||
$(cmd_make_builtin) $@ $(filter $(obj-y), $^) \
|
||||
$(cmd_secanalysis),\
|
||||
rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)
|
||||
$(cmd_make_empty_builtin) $@)
|
||||
|
||||
$(builtin-target): $(obj-y) FORCE
|
||||
$(call if_changed,link_o_target)
|
||||
@@ -389,12 +400,36 @@ $(modorder-target): $(subdir-ym) FORCE
|
||||
#
|
||||
ifdef lib-target
|
||||
quiet_cmd_link_l_target = AR $@
|
||||
cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y)
|
||||
|
||||
ifdef CONFIG_THIN_ARCHIVES
|
||||
cmd_link_l_target = rm -f $@; $(AR) rcsT$(KBUILD_ARFLAGS) $@ $(lib-y)
|
||||
else
|
||||
cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y)
|
||||
endif
|
||||
|
||||
$(lib-target): $(lib-y) FORCE
|
||||
$(call if_changed,link_l_target)
|
||||
|
||||
targets += $(lib-target)
|
||||
|
||||
dummy-object = $(obj)/.lib_exports.o
|
||||
ksyms-lds = $(dot-target).lds
|
||||
ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
|
||||
ref_prefix = EXTERN(_
|
||||
else
|
||||
ref_prefix = EXTERN(
|
||||
endif
|
||||
|
||||
quiet_cmd_export_list = EXPORTS $@
|
||||
cmd_export_list = $(OBJDUMP) -h $< | \
|
||||
sed -ne '/___ksymtab/{s/.*+/$(ref_prefix)/;s/ .*/)/;p}' >$(ksyms-lds);\
|
||||
rm -f $(dummy-object);\
|
||||
$(AR) rcs$(KBUILD_ARFLAGS) $(dummy-object);\
|
||||
$(LD) $(ld_flags) -r -o $@ -T $(ksyms-lds) $(dummy-object);\
|
||||
rm $(dummy-object) $(ksyms-lds)
|
||||
|
||||
$(obj)/lib-ksyms.o: $(lib-target) FORCE
|
||||
$(call if_changed,export_list)
|
||||
endif
|
||||
|
||||
#
|
||||
|
||||
@@ -115,14 +115,18 @@ $(modules:.ko=.mod.o): %.mod.o: %.mod.c FORCE
|
||||
|
||||
targets += $(modules:.ko=.mod.o)
|
||||
|
||||
# Step 6), final link of the modules
|
||||
ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
|
||||
|
||||
# Step 6), final link of the modules with optional arch pass after final link
|
||||
quiet_cmd_ld_ko_o = LD [M] $@
|
||||
cmd_ld_ko_o = $(LD) -r $(LDFLAGS) \
|
||||
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
||||
-o $@ $(filter-out FORCE,$^)
|
||||
cmd_ld_ko_o = \
|
||||
$(LD) -r $(LDFLAGS) \
|
||||
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
||||
-o $@ $(filter-out FORCE,$^) ; \
|
||||
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
|
||||
|
||||
$(modules): %.ko :%.o %.mod.o FORCE
|
||||
$(call if_changed,ld_ko_o)
|
||||
+$(call if_changed,ld_ko_o)
|
||||
|
||||
targets += $(modules)
|
||||
|
||||
|
||||
@@ -82,8 +82,7 @@
|
||||
* to date before even starting the recursive build, so it's too late
|
||||
* at this point anyway.
|
||||
*
|
||||
* The algorithm to grep for "CONFIG_..." is bit unusual, but should
|
||||
* be fast ;-) We don't even try to really parse the header files, but
|
||||
* We don't even try to really parse the header files, but
|
||||
* merely grep, i.e. if CONFIG_FOO is mentioned in a comment, it will
|
||||
* be picked up as well. It's not a problem with respect to
|
||||
* correctness, since that can only give too many dependencies, thus
|
||||
@@ -115,11 +114,6 @@
|
||||
#include <ctype.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#define INT_CONF ntohl(0x434f4e46)
|
||||
#define INT_ONFI ntohl(0x4f4e4649)
|
||||
#define INT_NFIG ntohl(0x4e464947)
|
||||
#define INT_FIG_ ntohl(0x4649475f)
|
||||
|
||||
int insert_extra_deps;
|
||||
char *target;
|
||||
char *depfile;
|
||||
@@ -241,37 +235,22 @@ static void use_config(const char *m, int slen)
|
||||
print_config(m, slen);
|
||||
}
|
||||
|
||||
static void parse_config_file(const char *map, size_t len)
|
||||
static void parse_config_file(const char *p)
|
||||
{
|
||||
const int *end = (const int *) (map + len);
|
||||
/* start at +1, so that p can never be < map */
|
||||
const int *m = (const int *) map + 1;
|
||||
const char *p, *q;
|
||||
const char *q, *r;
|
||||
|
||||
for (; m < end; m++) {
|
||||
if (*m == INT_CONF) { p = (char *) m ; goto conf; }
|
||||
if (*m == INT_ONFI) { p = (char *) m-1; goto conf; }
|
||||
if (*m == INT_NFIG) { p = (char *) m-2; goto conf; }
|
||||
if (*m == INT_FIG_) { p = (char *) m-3; goto conf; }
|
||||
continue;
|
||||
conf:
|
||||
if (p > map + len - 7)
|
||||
continue;
|
||||
if (memcmp(p, "CONFIG_", 7))
|
||||
continue;
|
||||
while ((p = strstr(p, "CONFIG_"))) {
|
||||
p += 7;
|
||||
for (q = p; q < map + len; q++) {
|
||||
if (!(isalnum(*q) || *q == '_'))
|
||||
goto found;
|
||||
}
|
||||
continue;
|
||||
|
||||
found:
|
||||
if (!memcmp(q - 7, "_MODULE", 7))
|
||||
q -= 7;
|
||||
if (q - p < 0)
|
||||
continue;
|
||||
use_config(p, q - p);
|
||||
q = p;
|
||||
while (*q && (isalnum(*q) || *q == '_'))
|
||||
q++;
|
||||
if (memcmp(q - 7, "_MODULE", 7) == 0)
|
||||
r = q - 7;
|
||||
else
|
||||
r = q;
|
||||
if (r > p)
|
||||
use_config(p, r - p);
|
||||
p = q;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -291,7 +270,7 @@ static void do_config_file(const char *filename)
|
||||
{
|
||||
struct stat st;
|
||||
int fd;
|
||||
void *map;
|
||||
char *map;
|
||||
|
||||
fd = open(filename, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
@@ -308,18 +287,23 @@ static void do_config_file(const char *filename)
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
if ((long) map == -1) {
|
||||
perror("fixdep: mmap");
|
||||
map = malloc(st.st_size + 1);
|
||||
if (!map) {
|
||||
perror("fixdep: malloc");
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
parse_config_file(map, st.st_size);
|
||||
|
||||
munmap(map, st.st_size);
|
||||
|
||||
if (read(fd, map, st.st_size) != st.st_size) {
|
||||
perror("fixdep: read");
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
map[st.st_size] = '\0';
|
||||
close(fd);
|
||||
|
||||
parse_config_file(map);
|
||||
|
||||
free(map);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -446,22 +430,8 @@ static void print_deps(void)
|
||||
close(fd);
|
||||
}
|
||||
|
||||
static void traps(void)
|
||||
{
|
||||
static char test[] __attribute__((aligned(sizeof(int)))) = "CONF";
|
||||
int *p = (int *)test;
|
||||
|
||||
if (*p != INT_CONF) {
|
||||
fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianness? %#x\n",
|
||||
*p);
|
||||
exit(2);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
traps();
|
||||
|
||||
if (argc == 5 && !strcmp(argv[1], "-e")) {
|
||||
insert_extra_deps = 1;
|
||||
argv++;
|
||||
|
||||
@@ -97,7 +97,10 @@ print_mtime() {
|
||||
}
|
||||
|
||||
list_parse() {
|
||||
[ ! -L "$1" ] && echo "$1 \\" || :
|
||||
if [ -L "$1" ]; then
|
||||
return
|
||||
fi
|
||||
echo "$1" | sed 's/:/\\:/g; s/$/ \\/'
|
||||
}
|
||||
|
||||
# for each file print a line in following format
|
||||
|
||||
@@ -289,6 +289,23 @@ repeat:
|
||||
}
|
||||
break;
|
||||
|
||||
case ST_TYPEOF_1:
|
||||
if (token == IDENT)
|
||||
{
|
||||
if (is_reserved_word(yytext, yyleng)
|
||||
|| find_symbol(yytext, SYM_TYPEDEF, 1))
|
||||
{
|
||||
yyless(0);
|
||||
unput('(');
|
||||
lexstate = ST_NORMAL;
|
||||
token = TYPEOF_KEYW;
|
||||
break;
|
||||
}
|
||||
_APP("(", 1);
|
||||
}
|
||||
lexstate = ST_TYPEOF;
|
||||
/* FALLTHRU */
|
||||
|
||||
case ST_TYPEOF:
|
||||
switch (token)
|
||||
{
|
||||
@@ -313,24 +330,6 @@ repeat:
|
||||
}
|
||||
break;
|
||||
|
||||
case ST_TYPEOF_1:
|
||||
if (token == IDENT)
|
||||
{
|
||||
if (is_reserved_word(yytext, yyleng)
|
||||
|| find_symbol(yytext, SYM_TYPEDEF, 1))
|
||||
{
|
||||
yyless(0);
|
||||
unput('(');
|
||||
lexstate = ST_NORMAL;
|
||||
token = TYPEOF_KEYW;
|
||||
break;
|
||||
}
|
||||
_APP("(", 1);
|
||||
}
|
||||
APP;
|
||||
lexstate = ST_TYPEOF;
|
||||
goto repeat;
|
||||
|
||||
case ST_BRACKET:
|
||||
APP;
|
||||
switch (token)
|
||||
|
||||
@@ -2098,6 +2098,23 @@ repeat:
|
||||
}
|
||||
break;
|
||||
|
||||
case ST_TYPEOF_1:
|
||||
if (token == IDENT)
|
||||
{
|
||||
if (is_reserved_word(yytext, yyleng)
|
||||
|| find_symbol(yytext, SYM_TYPEDEF, 1))
|
||||
{
|
||||
yyless(0);
|
||||
unput('(');
|
||||
lexstate = ST_NORMAL;
|
||||
token = TYPEOF_KEYW;
|
||||
break;
|
||||
}
|
||||
_APP("(", 1);
|
||||
}
|
||||
lexstate = ST_TYPEOF;
|
||||
/* FALLTHRU */
|
||||
|
||||
case ST_TYPEOF:
|
||||
switch (token)
|
||||
{
|
||||
@@ -2122,24 +2139,6 @@ repeat:
|
||||
}
|
||||
break;
|
||||
|
||||
case ST_TYPEOF_1:
|
||||
if (token == IDENT)
|
||||
{
|
||||
if (is_reserved_word(yytext, yyleng)
|
||||
|| find_symbol(yytext, SYM_TYPEDEF, 1))
|
||||
{
|
||||
yyless(0);
|
||||
unput('(');
|
||||
lexstate = ST_NORMAL;
|
||||
token = TYPEOF_KEYW;
|
||||
break;
|
||||
}
|
||||
_APP("(", 1);
|
||||
}
|
||||
APP;
|
||||
lexstate = ST_TYPEOF;
|
||||
goto repeat;
|
||||
|
||||
case ST_BRACKET:
|
||||
APP;
|
||||
switch (token)
|
||||
|
||||
@@ -37,12 +37,40 @@ info()
|
||||
fi
|
||||
}
|
||||
|
||||
# Thin archive build here makes a final archive with
|
||||
# symbol table and indexes from vmlinux objects, which can be
|
||||
# used as input to linker.
|
||||
#
|
||||
# Traditional incremental style of link does not require this step
|
||||
#
|
||||
# built-in.o output file
|
||||
#
|
||||
archive_builtin()
|
||||
{
|
||||
if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
|
||||
info AR built-in.o
|
||||
rm -f built-in.o;
|
||||
${AR} rcsT${KBUILD_ARFLAGS} built-in.o \
|
||||
${KBUILD_VMLINUX_INIT} \
|
||||
${KBUILD_VMLINUX_MAIN}
|
||||
fi
|
||||
}
|
||||
|
||||
# Link of vmlinux.o used for section mismatch analysis
|
||||
# ${1} output file
|
||||
modpost_link()
|
||||
{
|
||||
${LD} ${LDFLAGS} -r -o ${1} ${KBUILD_VMLINUX_INIT} \
|
||||
--start-group ${KBUILD_VMLINUX_MAIN} --end-group
|
||||
local objects
|
||||
|
||||
if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
|
||||
objects="--whole-archive built-in.o"
|
||||
else
|
||||
objects="${KBUILD_VMLINUX_INIT} \
|
||||
--start-group \
|
||||
${KBUILD_VMLINUX_MAIN} \
|
||||
--end-group"
|
||||
fi
|
||||
${LD} ${LDFLAGS} -r -o ${1} ${objects}
|
||||
}
|
||||
|
||||
# Link of vmlinux
|
||||
@@ -51,18 +79,36 @@ modpost_link()
|
||||
vmlinux_link()
|
||||
{
|
||||
local lds="${objtree}/${KBUILD_LDS}"
|
||||
local objects
|
||||
|
||||
if [ "${SRCARCH}" != "um" ]; then
|
||||
${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2} \
|
||||
-T ${lds} ${KBUILD_VMLINUX_INIT} \
|
||||
--start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1}
|
||||
if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
|
||||
objects="--whole-archive built-in.o ${1}"
|
||||
else
|
||||
objects="${KBUILD_VMLINUX_INIT} \
|
||||
--start-group \
|
||||
${KBUILD_VMLINUX_MAIN} \
|
||||
--end-group \
|
||||
${1}"
|
||||
fi
|
||||
|
||||
${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2} \
|
||||
-T ${lds} ${objects}
|
||||
else
|
||||
${CC} ${CFLAGS_vmlinux} -o ${2} \
|
||||
-Wl,-T,${lds} ${KBUILD_VMLINUX_INIT} \
|
||||
-Wl,--start-group \
|
||||
${KBUILD_VMLINUX_MAIN} \
|
||||
-Wl,--end-group \
|
||||
-lutil -lrt -lpthread ${1}
|
||||
if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
|
||||
objects="-Wl,--whole-archive built-in.o ${1}"
|
||||
else
|
||||
objects="${KBUILD_VMLINUX_INIT} \
|
||||
-Wl,--start-group \
|
||||
${KBUILD_VMLINUX_MAIN} \
|
||||
-Wl,--end-group \
|
||||
${1}"
|
||||
fi
|
||||
|
||||
${CC} ${CFLAGS_vmlinux} -o ${2} \
|
||||
-Wl,-T,${lds} \
|
||||
${objects} \
|
||||
-lutil -lrt -lpthread
|
||||
rm -f linux
|
||||
fi
|
||||
}
|
||||
@@ -119,6 +165,7 @@ cleanup()
|
||||
rm -f .tmp_kallsyms*
|
||||
rm -f .tmp_version
|
||||
rm -f .tmp_vmlinux*
|
||||
rm -f built-in.o
|
||||
rm -f System.map
|
||||
rm -f vmlinux
|
||||
rm -f vmlinux.o
|
||||
@@ -162,6 +209,8 @@ case "${KCONFIG_CONFIG}" in
|
||||
. "./${KCONFIG_CONFIG}"
|
||||
esac
|
||||
|
||||
archive_builtin
|
||||
|
||||
#link vmlinux.o
|
||||
info LD vmlinux.o
|
||||
modpost_link vmlinux.o
|
||||
|
||||
Reference in New Issue
Block a user