Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild

* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild:
  kbuild: explain why DEBUG_SECTION_MISMATCH is UNDEFINED
  kbuild: fix building vmlinux.o
  kbuild: allow -fstack-protector to take effect
  kconfig: fix select in combination with default
This commit is contained in:
Linus Torvalds
2008-02-18 15:41:05 -08:00
3 changed files with 32 additions and 18 deletions

View File

@@ -507,6 +507,10 @@ else
KBUILD_CFLAGS += -O2 KBUILD_CFLAGS += -O2
endif endif
# Force gcc to behave correct even for buggy distributions
# Arch Makefiles may override this setting
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
include $(srctree)/arch/$(SRCARCH)/Makefile include $(srctree)/arch/$(SRCARCH)/Makefile
ifdef CONFIG_FRAME_POINTER ifdef CONFIG_FRAME_POINTER
@@ -525,9 +529,6 @@ ifdef CONFIG_DEBUG_SECTION_MISMATCH
KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once) KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
endif endif
# Force gcc to behave correct even for buggy distributions
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
# arch Makefile may override CC so keep this after arch Makefile is included # arch Makefile may override CC so keep this after arch Makefile is included
NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
CHECKFLAGS += $(NOSTDINC_FLAGS) CHECKFLAGS += $(NOSTDINC_FLAGS)
@@ -810,7 +811,9 @@ endif
$(Q)rm -f .old_version $(Q)rm -f .old_version
# build vmlinux.o first to catch section mismatch errors early # build vmlinux.o first to catch section mismatch errors early
$(kallsyms.o): vmlinux.o ifdef CONFIG_KALLSYMS
.tmp_vmlinux1: vmlinux.o
endif
vmlinux.o: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE vmlinux.o: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE
$(call if_changed_rule,vmlinux-modpost) $(call if_changed_rule,vmlinux-modpost)

View File

@@ -82,6 +82,9 @@ config HEADERS_CHECK
config DEBUG_SECTION_MISMATCH config DEBUG_SECTION_MISMATCH
bool "Enable full Section mismatch analysis" bool "Enable full Section mismatch analysis"
depends on UNDEFINED depends on UNDEFINED
# This option is on purpose disabled for now.
# It will be enabled when we are down to a resonable number
# of section mismatch warnings (< 10 for an allyesconfig build)
help help
The section mismatch analysis checks if there are illegal The section mismatch analysis checks if there are illegal
references from one section to another section. references from one section to another section.

View File

@@ -298,22 +298,30 @@ void sym_calc_value(struct symbol *sym)
if (sym_is_choice_value(sym) && sym->visible == yes) { if (sym_is_choice_value(sym) && sym->visible == yes) {
prop = sym_get_choice_prop(sym); prop = sym_get_choice_prop(sym);
newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
} else if (EXPR_OR(sym->visible, sym->rev_dep.tri) != no) { } else {
sym->flags |= SYMBOL_WRITE; if (sym->visible != no) {
if (sym_has_value(sym)) /* if the symbol is visible use the user value
newval.tri = sym->def[S_DEF_USER].tri; * if available, otherwise try the default value
else if (!sym_is_choice(sym)) { */
prop = sym_get_default_prop(sym);
if (prop)
newval.tri = expr_calc_value(prop->expr);
}
newval.tri = EXPR_OR(EXPR_AND(newval.tri, sym->visible), sym->rev_dep.tri);
} else if (!sym_is_choice(sym)) {
prop = sym_get_default_prop(sym);
if (prop) {
sym->flags |= SYMBOL_WRITE; sym->flags |= SYMBOL_WRITE;
newval.tri = expr_calc_value(prop->expr); if (sym_has_value(sym)) {
newval.tri = EXPR_AND(sym->def[S_DEF_USER].tri,
sym->visible);
goto calc_newval;
}
} }
if (sym->rev_dep.tri != no)
sym->flags |= SYMBOL_WRITE;
if (!sym_is_choice(sym)) {
prop = sym_get_default_prop(sym);
if (prop) {
sym->flags |= SYMBOL_WRITE;
newval.tri = EXPR_AND(expr_calc_value(prop->expr),
prop->visible.tri);
}
}
calc_newval:
newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
} }
if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
newval.tri = yes; newval.tri = yes;