Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild
* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild: (33 commits) xtensa: use DATA_DATA in xtensa powerpc: add missing DATA_DATA to powerpc cris: use DATA_DATA in cris kallsyms: remove usage of memmem and _GNU_SOURCE from scripts/kallsyms.c kbuild: use -fno-optimize-sibling-calls unconditionally kconfig: reset generated values only if Kconfig and .config agree. kbuild: fix the warning when running make tags kconfig: strip 'CONFIG_' automatically in kernel configuration search kbuild: use POSIX BRE in headers install target Whitelist references from __dbe_table to .init modpost white list pattern adjustment kbuild: do section mismatch check on full vmlinux kbuild: whitelist references from variables named _timer to .init.text kbuild: remove hardcoded _logo names from modpost kbuild: remove hardcoded apic_es7000 from modpost kbuild: warn about references from .init.text to .exit.text kbuild: consolidate section checks kbuild: refactor code in modpost to improve maintainability kbuild: ignore section mismatch warnings originating from .note section kbuild: .paravirtprobe section is obsolete, so modpost doesn't need to handle it ...
This commit is contained in:
Коммит
efffbeee5b
|
@ -501,6 +501,20 @@ more details, with real examples.
|
||||||
The third parameter may be a text as in this example, but it may also
|
The third parameter may be a text as in this example, but it may also
|
||||||
be an expanded variable or a macro.
|
be an expanded variable or a macro.
|
||||||
|
|
||||||
|
cc-fullversion
|
||||||
|
cc-fullversion is useful when the exact version of gcc is needed.
|
||||||
|
One typical use-case is when a specific GCC version is broken.
|
||||||
|
cc-fullversion points out a more specific version than cc-version does.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
#arch/powerpc/Makefile
|
||||||
|
$(Q)if test "$(call cc-fullversion)" = "040200" ; then \
|
||||||
|
echo -n '*** GCC-4.2.0 cannot compile the 64-bit powerpc ' ; \
|
||||||
|
false ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
In this example for a specific GCC version the build will error out explaining
|
||||||
|
to the user why it stops.
|
||||||
|
|
||||||
=== 4 Host Program support
|
=== 4 Host Program support
|
||||||
|
|
||||||
|
|
1
Kbuild
1
Kbuild
|
@ -13,6 +13,7 @@ offsets-file := include/asm-$(ARCH)/asm-offsets.h
|
||||||
always := $(offsets-file)
|
always := $(offsets-file)
|
||||||
targets := $(offsets-file)
|
targets := $(offsets-file)
|
||||||
targets += arch/$(ARCH)/kernel/asm-offsets.s
|
targets += arch/$(ARCH)/kernel/asm-offsets.s
|
||||||
|
clean-files := $(addprefix $(objtree)/,$(targets))
|
||||||
|
|
||||||
# Default sed regexp - multiline due to syntax constraints
|
# Default sed regexp - multiline due to syntax constraints
|
||||||
define sed-y
|
define sed-y
|
||||||
|
|
26
Makefile
26
Makefile
|
@ -492,7 +492,7 @@ endif
|
||||||
include $(srctree)/arch/$(ARCH)/Makefile
|
include $(srctree)/arch/$(ARCH)/Makefile
|
||||||
|
|
||||||
ifdef CONFIG_FRAME_POINTER
|
ifdef CONFIG_FRAME_POINTER
|
||||||
CFLAGS += -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,)
|
CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
||||||
else
|
else
|
||||||
CFLAGS += -fomit-frame-pointer
|
CFLAGS += -fomit-frame-pointer
|
||||||
endif
|
endif
|
||||||
|
@ -618,7 +618,7 @@ quiet_cmd_vmlinux__ ?= LD $@
|
||||||
cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \
|
cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \
|
||||||
-T $(vmlinux-lds) $(vmlinux-init) \
|
-T $(vmlinux-lds) $(vmlinux-init) \
|
||||||
--start-group $(vmlinux-main) --end-group \
|
--start-group $(vmlinux-main) --end-group \
|
||||||
$(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE ,$^)
|
$(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^)
|
||||||
|
|
||||||
# Generate new vmlinux version
|
# Generate new vmlinux version
|
||||||
quiet_cmd_vmlinux_version = GEN .version
|
quiet_cmd_vmlinux_version = GEN .version
|
||||||
|
@ -742,15 +742,31 @@ debug_kallsyms: .tmp_map$(last_kallsyms)
|
||||||
|
|
||||||
endif # ifdef CONFIG_KALLSYMS
|
endif # ifdef CONFIG_KALLSYMS
|
||||||
|
|
||||||
|
# Do modpost on a prelinked vmlinux. The finally linked vmlinux has
|
||||||
|
# relevant sections renamed as per the linker script.
|
||||||
|
quiet_cmd_vmlinux-modpost = LD $@
|
||||||
|
cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@ \
|
||||||
|
$(vmlinux-init) --start-group $(vmlinux-main) --end-group \
|
||||||
|
$(filter-out $(vmlinux-init) $(vmlinux-main) $(vmlinux-lds) FORCE ,$^)
|
||||||
|
define rule_vmlinux-modpost
|
||||||
|
:
|
||||||
|
+$(call cmd,vmlinux-modpost)
|
||||||
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
|
||||||
|
$(Q)echo 'cmd_$@ := $(cmd_vmlinux-modpost)' > $(dot-target).cmd
|
||||||
|
endef
|
||||||
|
|
||||||
# vmlinux image - including updated kernel symbols
|
# vmlinux image - including updated kernel symbols
|
||||||
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
|
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) vmlinux.o FORCE
|
||||||
ifdef CONFIG_HEADERS_CHECK
|
ifdef CONFIG_HEADERS_CHECK
|
||||||
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
|
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
|
||||||
endif
|
endif
|
||||||
|
$(call vmlinux-modpost)
|
||||||
$(call if_changed_rule,vmlinux__)
|
$(call if_changed_rule,vmlinux__)
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
|
|
||||||
$(Q)rm -f .old_version
|
$(Q)rm -f .old_version
|
||||||
|
|
||||||
|
vmlinux.o: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
|
||||||
|
$(call if_changed_rule,vmlinux-modpost)
|
||||||
|
|
||||||
# The actual objects are generated when descending,
|
# The actual objects are generated when descending,
|
||||||
# make sure no implicit rule kicks in
|
# make sure no implicit rule kicks in
|
||||||
$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
|
$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
|
||||||
|
@ -1323,7 +1339,7 @@ define xtags
|
||||||
-I __initdata,__exitdata,__acquires,__releases \
|
-I __initdata,__exitdata,__acquires,__releases \
|
||||||
-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
|
-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
|
||||||
--extra=+f --c-kinds=+px \
|
--extra=+f --c-kinds=+px \
|
||||||
--regex-asm='/ENTRY\(([^)]*)\).*/\1/'; \
|
--regex-asm='/^ENTRY\(([^)]*)\).*/\1/'; \
|
||||||
$(all-kconfigs) | xargs $1 -a \
|
$(all-kconfigs) | xargs $1 -a \
|
||||||
--langdef=kconfig \
|
--langdef=kconfig \
|
||||||
--language-force=kconfig \
|
--language-force=kconfig \
|
||||||
|
|
|
@ -44,7 +44,7 @@ SECTIONS
|
||||||
___data_start = . ;
|
___data_start = . ;
|
||||||
__Sdata = . ;
|
__Sdata = . ;
|
||||||
.data : { /* Data */
|
.data : { /* Data */
|
||||||
*(.data)
|
DATA_DATA
|
||||||
}
|
}
|
||||||
__edata = . ; /* End of data section */
|
__edata = . ; /* End of data section */
|
||||||
_edata = . ;
|
_edata = . ;
|
||||||
|
|
|
@ -49,7 +49,7 @@ SECTIONS
|
||||||
___data_start = . ;
|
___data_start = . ;
|
||||||
__Sdata = . ;
|
__Sdata = . ;
|
||||||
.data : { /* Data */
|
.data : { /* Data */
|
||||||
*(.data)
|
DATA_DATA
|
||||||
}
|
}
|
||||||
__edata = . ; /* End of data section. */
|
__edata = . ; /* End of data section. */
|
||||||
_edata = . ;
|
_edata = . ;
|
||||||
|
|
|
@ -66,4 +66,4 @@ static int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct genapic apic_es7000 = APIC_INIT("es7000", probe_es7000);
|
struct genapic __initdata_refok apic_es7000 = APIC_INIT("es7000", probe_es7000);
|
||||||
|
|
|
@ -201,6 +201,14 @@ checkbin:
|
||||||
false; \
|
false; \
|
||||||
fi ; \
|
fi ; \
|
||||||
fi
|
fi
|
||||||
|
@if test "$(call cc-fullversion)" = "040200" \
|
||||||
|
&& test "x${CONFIG_MODULES}${CONFIG_PPC64}" = "xyy" ; then \
|
||||||
|
echo -n '*** GCC-4.2.0 cannot compile the 64-bit powerpc ' ; \
|
||||||
|
echo 'kernel with modules enabled.' ; \
|
||||||
|
echo -n '*** Please use a different GCC version or ' ; \
|
||||||
|
echo 'disable kernel modules' ; \
|
||||||
|
false ; \
|
||||||
|
fi
|
||||||
@if ! /bin/echo dssall | $(AS) -many -o $(TOUT) >/dev/null 2>&1 ; then \
|
@if ! /bin/echo dssall | $(AS) -many -o $(TOUT) >/dev/null 2>&1 ; then \
|
||||||
echo -n '*** ${VERSION}.${PATCHLEVEL} kernels no longer build ' ; \
|
echo -n '*** ${VERSION}.${PATCHLEVEL} kernels no longer build ' ; \
|
||||||
echo 'correctly with old versions of binutils.' ; \
|
echo 'correctly with old versions of binutils.' ; \
|
||||||
|
|
|
@ -177,7 +177,9 @@ SECTIONS
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
.data : {
|
.data : {
|
||||||
*(.data .data.rel* .toc1)
|
DATA_DATA
|
||||||
|
*(.data.rel*)
|
||||||
|
*(.toc1)
|
||||||
*(.branch_lt)
|
*(.branch_lt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,7 +118,8 @@ SECTIONS
|
||||||
_fdata = .;
|
_fdata = .;
|
||||||
.data :
|
.data :
|
||||||
{
|
{
|
||||||
*(.data) CONSTRUCTORS
|
DATA_DATA
|
||||||
|
CONSTRUCTORS
|
||||||
. = ALIGN(XCHAL_ICACHE_LINESIZE);
|
. = ALIGN(XCHAL_ICACHE_LINESIZE);
|
||||||
*(.data.cacheline_aligned)
|
*(.data.cacheline_aligned)
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,8 +34,11 @@ extern const struct linux_logo logo_superh_vga16;
|
||||||
extern const struct linux_logo logo_superh_clut224;
|
extern const struct linux_logo logo_superh_clut224;
|
||||||
extern const struct linux_logo logo_m32r_clut224;
|
extern const struct linux_logo logo_m32r_clut224;
|
||||||
|
|
||||||
|
/* logo's are marked __initdata. Use __init_refok to tell
|
||||||
const struct linux_logo *fb_find_logo(int depth)
|
* modpost that it is intended that this function uses data
|
||||||
|
* marked __initdata.
|
||||||
|
*/
|
||||||
|
const struct linux_logo * __init_refok fb_find_logo(int depth)
|
||||||
{
|
{
|
||||||
const struct linux_logo *logo = NULL;
|
const struct linux_logo *logo = NULL;
|
||||||
|
|
||||||
|
|
|
@ -100,9 +100,14 @@ cc-option-align = $(subst -functions=0,,\
|
||||||
$(call cc-option,-falign-functions=0,-malign-functions=0))
|
$(call cc-option,-falign-functions=0,-malign-functions=0))
|
||||||
|
|
||||||
# cc-version
|
# cc-version
|
||||||
# Usage gcc-ver := $(call cc-version,$(CC))
|
# Usage gcc-ver := $(call cc-version)
|
||||||
cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
|
cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
|
||||||
|
|
||||||
|
# cc-fullversion
|
||||||
|
# Usage gcc-ver := $(call cc-fullversion)
|
||||||
|
cc-fullversion = $(shell $(CONFIG_SHELL) \
|
||||||
|
$(srctree)/scripts/gcc-version.sh -p $(CC))
|
||||||
|
|
||||||
# cc-ifversion
|
# cc-ifversion
|
||||||
# Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
|
# Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
|
||||||
cc-ifversion = $(shell [ $(call cc-version, $(CC)) $(1) $(2) ] && echo $(3))
|
cc-ifversion = $(shell [ $(call cc-version, $(CC)) $(1) $(2) ] && echo $(3))
|
||||||
|
|
|
@ -7,6 +7,22 @@ src := $(obj)
|
||||||
PHONY := __build
|
PHONY := __build
|
||||||
__build:
|
__build:
|
||||||
|
|
||||||
|
# Init all relevant variables used in kbuild files so
|
||||||
|
# 1) they have correct type
|
||||||
|
# 2) they do not inherit any value from the environment
|
||||||
|
obj-y :=
|
||||||
|
obj-m :=
|
||||||
|
lib-y :=
|
||||||
|
lib-m :=
|
||||||
|
always :=
|
||||||
|
targets :=
|
||||||
|
subdir-y :=
|
||||||
|
subdir-m :=
|
||||||
|
EXTRA_AFLAGS :=
|
||||||
|
EXTRA_CFLAGS :=
|
||||||
|
EXTRA_CPPFLAGS :=
|
||||||
|
EXTRA_LDFLAGS :=
|
||||||
|
|
||||||
# Read .config if it exist, otherwise ignore
|
# Read .config if it exist, otherwise ignore
|
||||||
-include include/config/auto.conf
|
-include include/config/auto.conf
|
||||||
|
|
||||||
|
|
|
@ -11,13 +11,13 @@ UNIFDEF := scripts/unifdef -U__KERNEL__
|
||||||
|
|
||||||
# Eliminate the contents of (and inclusions of) compiler.h
|
# Eliminate the contents of (and inclusions of) compiler.h
|
||||||
HDRSED := sed -e "s/ inline / __inline__ /g" \
|
HDRSED := sed -e "s/ inline / __inline__ /g" \
|
||||||
-e "s/[[:space:]]__user[[:space:]]\+/ /g" \
|
-e "s/[[:space:]]__user[[:space:]]\{1,\}/ /g" \
|
||||||
-e "s/(__user[[:space:]]\+/ (/g" \
|
-e "s/(__user[[:space:]]\{1,\}/ (/g" \
|
||||||
-e "s/[[:space:]]__force[[:space:]]\+/ /g" \
|
-e "s/[[:space:]]__force[[:space:]]\{1,\}/ /g" \
|
||||||
-e "s/(__force[[:space:]]\+/ (/g" \
|
-e "s/(__force[[:space:]]\{1,\}/ (/g" \
|
||||||
-e "s/[[:space:]]__iomem[[:space:]]\+/ /g" \
|
-e "s/[[:space:]]__iomem[[:space:]]\{1,\}/ /g" \
|
||||||
-e "s/(__iomem[[:space:]]\+/ (/g" \
|
-e "s/(__iomem[[:space:]]\{1,\}/ (/g" \
|
||||||
-e "s/[[:space:]]__attribute_const__[[:space:]]\+/\ /g" \
|
-e "s/[[:space:]]__attribute_const__[[:space:]]\{1,\}/\ /g" \
|
||||||
-e "s/[[:space:]]__attribute_const__$$//" \
|
-e "s/[[:space:]]__attribute_const__$$//" \
|
||||||
-e "/^\#include <linux\/compiler.h>/d"
|
-e "/^\#include <linux\/compiler.h>/d"
|
||||||
|
|
||||||
|
|
|
@ -70,10 +70,10 @@ __modpost: $(modules:.ko=.o) FORCE
|
||||||
$(call cmd,modpost) $(wildcard vmlinux) $(filter-out FORCE,$^)
|
$(call cmd,modpost) $(wildcard vmlinux) $(filter-out FORCE,$^)
|
||||||
|
|
||||||
quiet_cmd_kernel-mod = MODPOST $@
|
quiet_cmd_kernel-mod = MODPOST $@
|
||||||
cmd_kernel-mod = $(cmd_modpost) $(KBUILD_VMLINUX_OBJS)
|
cmd_kernel-mod = $(cmd_modpost) $@
|
||||||
|
|
||||||
PHONY += vmlinux
|
PHONY += vmlinux
|
||||||
vmlinux: FORCE
|
vmlinux.o: FORCE
|
||||||
$(call cmd,kernel-mod)
|
$(call cmd,kernel-mod)
|
||||||
|
|
||||||
# Declare generated files as targets for modpost
|
# Declare generated files as targets for modpost
|
||||||
|
|
|
@ -7,7 +7,9 @@
|
||||||
use bytes;
|
use bytes;
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
|
|
||||||
#
|
# Default options
|
||||||
|
$max_width = 79;
|
||||||
|
|
||||||
# Clean up space-tab sequences, either by removing spaces or
|
# Clean up space-tab sequences, either by removing spaces or
|
||||||
# replacing them with tabs.
|
# replacing them with tabs.
|
||||||
sub clean_space_tabs($)
|
sub clean_space_tabs($)
|
||||||
|
@ -48,9 +50,49 @@ sub clean_space_tabs($)
|
||||||
return $lo;
|
return $lo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Compute the visual width of a string
|
||||||
|
sub strwidth($) {
|
||||||
|
no bytes; # Tab alignment depends on characters
|
||||||
|
|
||||||
|
my($li) = @_;
|
||||||
|
my($c, $i);
|
||||||
|
my $pos = 0;
|
||||||
|
my $mlen = 0;
|
||||||
|
|
||||||
|
for ($i = 0; $i < length($li); $i++) {
|
||||||
|
$c = substr($li,$i,1);
|
||||||
|
if ($c eq "\t") {
|
||||||
|
$pos = ($pos+8) & ~7;
|
||||||
|
} elsif ($c eq "\n") {
|
||||||
|
$mlen = $pos if ($pos > $mlen);
|
||||||
|
$pos = 0;
|
||||||
|
} else {
|
||||||
|
$pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$mlen = $pos if ($pos > $mlen);
|
||||||
|
return $mlen;
|
||||||
|
}
|
||||||
|
|
||||||
$name = basename($0);
|
$name = basename($0);
|
||||||
|
|
||||||
foreach $f ( @ARGV ) {
|
@files = ();
|
||||||
|
|
||||||
|
while (defined($a = shift(@ARGV))) {
|
||||||
|
if ($a =~ /^-/) {
|
||||||
|
if ($a eq '-width' || $a eq '-w') {
|
||||||
|
$max_width = shift(@ARGV)+0;
|
||||||
|
} else {
|
||||||
|
print STDERR "Usage: $name [-width #] files...\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
push(@files, $a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach $f ( @files ) {
|
||||||
print STDERR "$name: $f\n";
|
print STDERR "$name: $f\n";
|
||||||
|
|
||||||
if (! -f $f) {
|
if (! -f $f) {
|
||||||
|
@ -90,8 +132,10 @@ foreach $f ( @ARGV ) {
|
||||||
|
|
||||||
@blanks = ();
|
@blanks = ();
|
||||||
@lines = ();
|
@lines = ();
|
||||||
|
$lineno = 0;
|
||||||
|
|
||||||
while ( defined($line = <FILE>) ) {
|
while ( defined($line = <FILE>) ) {
|
||||||
|
$lineno++;
|
||||||
$in_bytes += length($line);
|
$in_bytes += length($line);
|
||||||
$line =~ s/[ \t\r]*$//; # Remove trailing spaces
|
$line =~ s/[ \t\r]*$//; # Remove trailing spaces
|
||||||
$line = clean_space_tabs($line);
|
$line = clean_space_tabs($line);
|
||||||
|
@ -107,6 +151,12 @@ foreach $f ( @ARGV ) {
|
||||||
@blanks = ();
|
@blanks = ();
|
||||||
$blank_bytes = 0;
|
$blank_bytes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$l_width = strwidth($line);
|
||||||
|
if ($max_width && $l_width > $max_width) {
|
||||||
|
print STDERR
|
||||||
|
"$f:$lineno: line exceeds $max_width characters ($l_width)\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Any blanks at the end of the file are discarded
|
# Any blanks at the end of the file are discarded
|
||||||
|
|
|
@ -7,7 +7,9 @@
|
||||||
use bytes;
|
use bytes;
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
|
|
||||||
#
|
# Default options
|
||||||
|
$max_width = 79;
|
||||||
|
|
||||||
# Clean up space-tab sequences, either by removing spaces or
|
# Clean up space-tab sequences, either by removing spaces or
|
||||||
# replacing them with tabs.
|
# replacing them with tabs.
|
||||||
sub clean_space_tabs($)
|
sub clean_space_tabs($)
|
||||||
|
@ -48,9 +50,49 @@ sub clean_space_tabs($)
|
||||||
return $lo;
|
return $lo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Compute the visual width of a string
|
||||||
|
sub strwidth($) {
|
||||||
|
no bytes; # Tab alignment depends on characters
|
||||||
|
|
||||||
|
my($li) = @_;
|
||||||
|
my($c, $i);
|
||||||
|
my $pos = 0;
|
||||||
|
my $mlen = 0;
|
||||||
|
|
||||||
|
for ($i = 0; $i < length($li); $i++) {
|
||||||
|
$c = substr($li,$i,1);
|
||||||
|
if ($c eq "\t") {
|
||||||
|
$pos = ($pos+8) & ~7;
|
||||||
|
} elsif ($c eq "\n") {
|
||||||
|
$mlen = $pos if ($pos > $mlen);
|
||||||
|
$pos = 0;
|
||||||
|
} else {
|
||||||
|
$pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$mlen = $pos if ($pos > $mlen);
|
||||||
|
return $mlen;
|
||||||
|
}
|
||||||
|
|
||||||
$name = basename($0);
|
$name = basename($0);
|
||||||
|
|
||||||
foreach $f ( @ARGV ) {
|
@files = ();
|
||||||
|
|
||||||
|
while (defined($a = shift(@ARGV))) {
|
||||||
|
if ($a =~ /^-/) {
|
||||||
|
if ($a eq '-width' || $a eq '-w') {
|
||||||
|
$max_width = shift(@ARGV)+0;
|
||||||
|
} else {
|
||||||
|
print STDERR "Usage: $name [-width #] files...\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
push(@files, $a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach $f ( @files ) {
|
||||||
print STDERR "$name: $f\n";
|
print STDERR "$name: $f\n";
|
||||||
|
|
||||||
if (! -f $f) {
|
if (! -f $f) {
|
||||||
|
@ -86,6 +128,7 @@ foreach $f ( @ARGV ) {
|
||||||
|
|
||||||
$in_bytes = 0;
|
$in_bytes = 0;
|
||||||
$out_bytes = 0;
|
$out_bytes = 0;
|
||||||
|
$lineno = 0;
|
||||||
|
|
||||||
@lines = ();
|
@lines = ();
|
||||||
|
|
||||||
|
@ -93,10 +136,12 @@ foreach $f ( @ARGV ) {
|
||||||
$err = 0;
|
$err = 0;
|
||||||
|
|
||||||
while ( defined($line = <FILE>) ) {
|
while ( defined($line = <FILE>) ) {
|
||||||
|
$lineno++;
|
||||||
$in_bytes += length($line);
|
$in_bytes += length($line);
|
||||||
|
|
||||||
if (!$in_hunk) {
|
if (!$in_hunk) {
|
||||||
if ($line =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@/) {
|
if ($line =~
|
||||||
|
/^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@/) {
|
||||||
$minus_lines = $2;
|
$minus_lines = $2;
|
||||||
$plus_lines = $4;
|
$plus_lines = $4;
|
||||||
if ($minus_lines || $plus_lines) {
|
if ($minus_lines || $plus_lines) {
|
||||||
|
@ -117,6 +162,13 @@ foreach $f ( @ARGV ) {
|
||||||
$text =~ s/[ \t\r]*$//; # Remove trailing spaces
|
$text =~ s/[ \t\r]*$//; # Remove trailing spaces
|
||||||
$text = clean_space_tabs($text);
|
$text = clean_space_tabs($text);
|
||||||
|
|
||||||
|
$l_width = strwidth($text);
|
||||||
|
if ($max_width && $l_width > $max_width) {
|
||||||
|
print STDERR
|
||||||
|
"$f:$lineno: adds line exceeds $max_width ",
|
||||||
|
"characters ($l_width)\n";
|
||||||
|
}
|
||||||
|
|
||||||
push(@hunk_lines, '+'.$text);
|
push(@hunk_lines, '+'.$text);
|
||||||
} elsif ($line =~ /^\-/) {
|
} elsif ($line =~ /^\-/) {
|
||||||
$minus_lines--;
|
$minus_lines--;
|
||||||
|
|
|
@ -1,14 +1,23 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# gcc-version gcc-command
|
# gcc-version [-p] gcc-command
|
||||||
#
|
#
|
||||||
# Prints the gcc version of `gcc-command' in a canonical 4-digit form
|
# Prints the gcc version of `gcc-command' in a canonical 4-digit form
|
||||||
# such as `0295' for gcc-2.95, `0303' for gcc-3.3, etc.
|
# such as `0295' for gcc-2.95, `0303' for gcc-3.3, etc.
|
||||||
#
|
#
|
||||||
|
# With the -p option, prints the patchlevel as well, for example `029503' for
|
||||||
|
# gcc-2.95.3, `030301' for gcc-3.3.1, etc.
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ $1 = "-p" ] ; then with_patchlevel=1; shift; fi
|
||||||
|
|
||||||
compiler="$*"
|
compiler="$*"
|
||||||
|
|
||||||
MAJOR=$(echo __GNUC__ | $compiler -E -xc - | tail -n 1)
|
MAJOR=$(echo __GNUC__ | $compiler -E -xc - | tail -n 1)
|
||||||
MINOR=$(echo __GNUC_MINOR__ | $compiler -E -xc - | tail -n 1)
|
MINOR=$(echo __GNUC_MINOR__ | $compiler -E -xc - | tail -n 1)
|
||||||
printf "%02d%02d\\n" $MAJOR $MINOR
|
if [ "x$with_patchlevel" != "x" ] ; then
|
||||||
|
PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -xc - | tail -n 1)
|
||||||
|
printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL
|
||||||
|
else
|
||||||
|
printf "%02d%02d\\n" $MAJOR $MINOR
|
||||||
|
fi
|
||||||
|
|
|
@ -19,11 +19,11 @@ $0 [-o <file>] [-u <uid>] [-g <gid>] {-d | <cpio_source>} ...
|
||||||
-o <file> Create gzipped initramfs file named <file> using
|
-o <file> Create gzipped initramfs file named <file> using
|
||||||
gen_init_cpio and gzip
|
gen_init_cpio and gzip
|
||||||
-u <uid> User ID to map to user ID 0 (root).
|
-u <uid> User ID to map to user ID 0 (root).
|
||||||
<uid> is only meaningful if <cpio_source>
|
<uid> is only meaningful if <cpio_source> is a
|
||||||
is a directory.
|
directory. "squash" forces all files to uid 0.
|
||||||
-g <gid> Group ID to map to group ID 0 (root).
|
-g <gid> Group ID to map to group ID 0 (root).
|
||||||
<gid> is only meaningful if <cpio_source>
|
<gid> is only meaningful if <cpio_source> is a
|
||||||
is a directory.
|
directory. "squash" forces all files to gid 0.
|
||||||
<cpio_source> File list or directory for cpio archive.
|
<cpio_source> File list or directory for cpio archive.
|
||||||
If <cpio_source> is a .cpio file it will be used
|
If <cpio_source> is a .cpio file it will be used
|
||||||
as direct input to initramfs.
|
as direct input to initramfs.
|
||||||
|
@ -113,8 +113,8 @@ parse() {
|
||||||
local gid="$4"
|
local gid="$4"
|
||||||
local ftype=$(filetype "${location}")
|
local ftype=$(filetype "${location}")
|
||||||
# remap uid/gid to 0 if necessary
|
# remap uid/gid to 0 if necessary
|
||||||
[ "$uid" -eq "$root_uid" ] && uid=0
|
[ "$root_uid" = "squash" ] && uid=0 || [ "$uid" -eq "$root_uid" ] && uid=0
|
||||||
[ "$gid" -eq "$root_gid" ] && gid=0
|
[ "$root_gid" = "squash" ] && gid=0 || [ "$gid" -eq "$root_gid" ] && gid=0
|
||||||
local str="${mode} ${uid} ${gid}"
|
local str="${mode} ${uid} ${gid}"
|
||||||
|
|
||||||
[ "${ftype}" == "invalid" ] && return 0
|
[ "${ftype}" == "invalid" ] && return 0
|
||||||
|
|
|
@ -24,8 +24,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -378,6 +376,17 @@ static void build_initial_tok_table(void)
|
||||||
table_cnt = pos;
|
table_cnt = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *find_token(unsigned char *str, int len, unsigned char *token)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < len - 1; i++) {
|
||||||
|
if (str[i] == token[0] && str[i+1] == token[1])
|
||||||
|
return &str[i];
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* replace a given token in all the valid symbols. Use the sampled symbols
|
/* replace a given token in all the valid symbols. Use the sampled symbols
|
||||||
* to update the counts */
|
* to update the counts */
|
||||||
static void compress_symbols(unsigned char *str, int idx)
|
static void compress_symbols(unsigned char *str, int idx)
|
||||||
|
@ -391,7 +400,7 @@ static void compress_symbols(unsigned char *str, int idx)
|
||||||
p1 = table[i].sym;
|
p1 = table[i].sym;
|
||||||
|
|
||||||
/* find the token on the symbol */
|
/* find the token on the symbol */
|
||||||
p2 = memmem(p1, len, str, 2);
|
p2 = find_token(p1, len, str);
|
||||||
if (!p2) continue;
|
if (!p2) continue;
|
||||||
|
|
||||||
/* decrease the counts for this symbol's tokens */
|
/* decrease the counts for this symbol's tokens */
|
||||||
|
@ -410,7 +419,7 @@ static void compress_symbols(unsigned char *str, int idx)
|
||||||
if (size < 2) break;
|
if (size < 2) break;
|
||||||
|
|
||||||
/* find the token on the symbol */
|
/* find the token on the symbol */
|
||||||
p2 = memmem(p1, size, str, 2);
|
p2 = find_token(p1, size, str);
|
||||||
|
|
||||||
} while (p2);
|
} while (p2);
|
||||||
|
|
||||||
|
|
|
@ -22,24 +22,25 @@ oldconfig: $(obj)/conf
|
||||||
silentoldconfig: $(obj)/conf
|
silentoldconfig: $(obj)/conf
|
||||||
$< -s arch/$(ARCH)/Kconfig
|
$< -s arch/$(ARCH)/Kconfig
|
||||||
|
|
||||||
|
# Create new linux.po file
|
||||||
|
# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
|
||||||
|
# The symlink is used to repair a deficiency in arch/um
|
||||||
update-po-config: $(obj)/kxgettext
|
update-po-config: $(obj)/kxgettext
|
||||||
xgettext --default-domain=linux \
|
xgettext --default-domain=linux \
|
||||||
--add-comments --keyword=_ --keyword=N_ \
|
--add-comments --keyword=_ --keyword=N_ \
|
||||||
--files-from=scripts/kconfig/POTFILES.in \
|
--from-code=UTF-8 \
|
||||||
--output scripts/kconfig/config.pot
|
--files-from=scripts/kconfig/POTFILES.in \
|
||||||
$(Q)ln -fs Kconfig_i386 arch/um/Kconfig_arch
|
--output $(obj)/config.pot
|
||||||
$(Q)for i in `ls arch/`; \
|
$(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot
|
||||||
do \
|
$(Q)ln -fs Kconfig.i386 arch/um/Kconfig.arch
|
||||||
scripts/kconfig/kxgettext arch/$$i/Kconfig \
|
(for i in `ls arch/`; \
|
||||||
| msguniq -o scripts/kconfig/linux_$${i}.pot; \
|
do \
|
||||||
done
|
$(obj)/kxgettext arch/$$i/Kconfig; \
|
||||||
$(Q)msgcat scripts/kconfig/config.pot \
|
done ) >> $(obj)/config.pot
|
||||||
`find scripts/kconfig/ -type f -name linux_*.pot` \
|
msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
|
||||||
--output scripts/kconfig/linux_raw.pot
|
--output $(obj)/linux.pot
|
||||||
$(Q)msguniq --sort-by-file scripts/kconfig/linux_raw.pot \
|
$(Q)rm -f arch/um/Kconfig.arch
|
||||||
--output scripts/kconfig/linux.pot
|
$(Q)rm -f $(obj)/config.pot
|
||||||
$(Q)rm -f arch/um/Kconfig_arch
|
|
||||||
$(Q)rm -f scripts/kconfig/linux_*.pot scripts/kconfig/config.pot
|
|
||||||
|
|
||||||
PHONY += randconfig allyesconfig allnoconfig allmodconfig defconfig
|
PHONY += randconfig allyesconfig allnoconfig allmodconfig defconfig
|
||||||
|
|
||||||
|
|
|
@ -341,21 +341,11 @@ int conf_read(const char *name)
|
||||||
conf_unsaved++;
|
conf_unsaved++;
|
||||||
/* maybe print value in verbose mode... */
|
/* maybe print value in verbose mode... */
|
||||||
sym_ok:
|
sym_ok:
|
||||||
if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
|
|
||||||
if (sym->visible == no)
|
|
||||||
sym->flags &= ~SYMBOL_DEF_USER;
|
|
||||||
switch (sym->type) {
|
|
||||||
case S_STRING:
|
|
||||||
case S_INT:
|
|
||||||
case S_HEX:
|
|
||||||
if (!sym_string_within_range(sym, sym->def[S_DEF_USER].val))
|
|
||||||
sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!sym_is_choice(sym))
|
if (!sym_is_choice(sym))
|
||||||
continue;
|
continue;
|
||||||
|
/* The choice symbol only has a set value (and thus is not new)
|
||||||
|
* if all its visible childs have values.
|
||||||
|
*/
|
||||||
prop = sym_get_choice_prop(sym);
|
prop = sym_get_choice_prop(sym);
|
||||||
flags = sym->flags;
|
flags = sym->flags;
|
||||||
for (e = prop->expr; e; e = e->left.expr)
|
for (e = prop->expr; e; e = e->left.expr)
|
||||||
|
@ -364,6 +354,31 @@ int conf_read(const char *name)
|
||||||
sym->flags &= flags | ~SYMBOL_DEF_USER;
|
sym->flags &= flags | ~SYMBOL_DEF_USER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
|
||||||
|
/* Reset values of generates values, so they'll appear
|
||||||
|
* as new, if they should become visible, but that
|
||||||
|
* doesn't quite work if the Kconfig and the saved
|
||||||
|
* configuration disagree.
|
||||||
|
*/
|
||||||
|
if (sym->visible == no && !conf_unsaved)
|
||||||
|
sym->flags &= ~SYMBOL_DEF_USER;
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_STRING:
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
/* Reset a string value if it's out of range */
|
||||||
|
if (sym_string_within_range(sym, sym->def[S_DEF_USER].val))
|
||||||
|
break;
|
||||||
|
sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
|
||||||
|
conf_unsaved++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sym_add_change_count(conf_warnings || conf_unsaved);
|
sym_add_change_count(conf_warnings || conf_unsaved);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -212,7 +212,9 @@ void menu__xgettext(void)
|
||||||
struct message *m = message__list;
|
struct message *m = message__list;
|
||||||
|
|
||||||
while (m != NULL) {
|
while (m != NULL) {
|
||||||
message__print_gettext_msgid_msgstr(m);
|
/* skip empty lines ("") */
|
||||||
|
if (strlen(m->msg) > sizeof("\"\""))
|
||||||
|
message__print_gettext_msgid_msgstr(m);
|
||||||
m = m->next;
|
m = m->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ usage() {
|
||||||
printf "Usage: $0 [-check compiler options|-header|-library]\n"
|
printf "Usage: $0 [-check compiler options|-header|-library]\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ $# == 0 ]; then
|
if [ $# -eq 0 ]; then
|
||||||
usage
|
usage
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -419,11 +419,13 @@ static void search_conf(void)
|
||||||
{
|
{
|
||||||
struct symbol **sym_arr;
|
struct symbol **sym_arr;
|
||||||
struct gstr res;
|
struct gstr res;
|
||||||
|
char *dialog_input;
|
||||||
int dres;
|
int dres;
|
||||||
again:
|
again:
|
||||||
dialog_clear();
|
dialog_clear();
|
||||||
dres = dialog_inputbox(_("Search Configuration Parameter"),
|
dres = dialog_inputbox(_("Search Configuration Parameter"),
|
||||||
_("Enter CONFIG_ (sub)string to search for (omit CONFIG_)"),
|
_("Enter CONFIG_ (sub)string to search for "
|
||||||
|
"(with or without \"CONFIG\")"),
|
||||||
10, 75, "");
|
10, 75, "");
|
||||||
switch (dres) {
|
switch (dres) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -435,7 +437,12 @@ again:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sym_arr = sym_re_search(dialog_input_result);
|
/* strip CONFIG_ if necessary */
|
||||||
|
dialog_input = dialog_input_result;
|
||||||
|
if (strncasecmp(dialog_input_result, "CONFIG_", 7) == 0)
|
||||||
|
dialog_input += 7;
|
||||||
|
|
||||||
|
sym_arr = sym_re_search(dialog_input);
|
||||||
res = get_relations_str(sym_arr);
|
res = get_relations_str(sym_arr);
|
||||||
free(sym_arr);
|
free(sym_arr);
|
||||||
show_textbox(_("Search Results"), str_get(&res), 0, 0);
|
show_textbox(_("Search Results"), str_get(&res), 0, 0);
|
||||||
|
|
|
@ -75,7 +75,8 @@ static int is_vmlinux(const char *modname)
|
||||||
else
|
else
|
||||||
myname = modname;
|
myname = modname;
|
||||||
|
|
||||||
return strcmp(myname, "vmlinux") == 0;
|
return (strcmp(myname, "vmlinux") == 0) ||
|
||||||
|
(strcmp(myname, "vmlinux.o") == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *do_nofail(void *ptr, const char *expr)
|
void *do_nofail(void *ptr, const char *expr)
|
||||||
|
@ -374,6 +375,7 @@ static int parse_elf(struct elf_info *info, const char *filename)
|
||||||
hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx);
|
hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx);
|
||||||
hdr->e_shnum = TO_NATIVE(hdr->e_shnum);
|
hdr->e_shnum = TO_NATIVE(hdr->e_shnum);
|
||||||
hdr->e_machine = TO_NATIVE(hdr->e_machine);
|
hdr->e_machine = TO_NATIVE(hdr->e_machine);
|
||||||
|
hdr->e_type = TO_NATIVE(hdr->e_type);
|
||||||
sechdrs = (void *)hdr + hdr->e_shoff;
|
sechdrs = (void *)hdr + hdr->e_shoff;
|
||||||
info->sechdrs = sechdrs;
|
info->sechdrs = sechdrs;
|
||||||
|
|
||||||
|
@ -384,6 +386,8 @@ static int parse_elf(struct elf_info *info, const char *filename)
|
||||||
sechdrs[i].sh_size = TO_NATIVE(sechdrs[i].sh_size);
|
sechdrs[i].sh_size = TO_NATIVE(sechdrs[i].sh_size);
|
||||||
sechdrs[i].sh_link = TO_NATIVE(sechdrs[i].sh_link);
|
sechdrs[i].sh_link = TO_NATIVE(sechdrs[i].sh_link);
|
||||||
sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name);
|
sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name);
|
||||||
|
sechdrs[i].sh_info = TO_NATIVE(sechdrs[i].sh_info);
|
||||||
|
sechdrs[i].sh_addr = TO_NATIVE(sechdrs[i].sh_addr);
|
||||||
}
|
}
|
||||||
/* Find symbol table. */
|
/* Find symbol table. */
|
||||||
for (i = 1; i < hdr->e_shnum; i++) {
|
for (i = 1; i < hdr->e_shnum; i++) {
|
||||||
|
@ -605,18 +609,14 @@ static int strrcmp(const char *s, const char *sub)
|
||||||
* warn here.
|
* warn here.
|
||||||
* the pattern is identified by:
|
* the pattern is identified by:
|
||||||
* tosec = .init.text | .exit.text | .init.data
|
* tosec = .init.text | .exit.text | .init.data
|
||||||
* fromsec = .data
|
* fromsec = .data | .data.rel | .data.rel.*
|
||||||
* atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one, *_console
|
* atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one, *_console, *_timer
|
||||||
*
|
*
|
||||||
* Pattern 3:
|
* Pattern 3:
|
||||||
* Whitelist all references from .pci_fixup* section to .init.text
|
|
||||||
* This is part of the PCI init when built-in
|
|
||||||
*
|
|
||||||
* Pattern 4:
|
|
||||||
* Whitelist all refereces from .text.head to .init.data
|
* Whitelist all refereces from .text.head to .init.data
|
||||||
* Whitelist all refereces from .text.head to .init.text
|
* Whitelist all refereces from .text.head to .init.text
|
||||||
*
|
*
|
||||||
* Pattern 5:
|
* Pattern 4:
|
||||||
* Some symbols belong to init section but still it is ok to reference
|
* Some symbols belong to init section but still it is ok to reference
|
||||||
* these from non-init sections as these symbols don't have any memory
|
* these from non-init sections as these symbols don't have any memory
|
||||||
* allocated for them and symbol address and value are same. So even
|
* allocated for them and symbol address and value are same. So even
|
||||||
|
@ -625,26 +625,6 @@ static int strrcmp(const char *s, const char *sub)
|
||||||
* This pattern is identified by
|
* This pattern is identified by
|
||||||
* refsymname = __init_begin, _sinittext, _einittext
|
* refsymname = __init_begin, _sinittext, _einittext
|
||||||
*
|
*
|
||||||
* Pattern 7:
|
|
||||||
* Logos used in drivers/video/logo reside in __initdata but the
|
|
||||||
* funtion that references them are EXPORT_SYMBOL() so cannot be
|
|
||||||
* marker __init. So we whitelist them here.
|
|
||||||
* The pattern is:
|
|
||||||
* tosec = .init.data
|
|
||||||
* fromsec = .text*
|
|
||||||
* refsymname = logo_
|
|
||||||
*
|
|
||||||
* Pattern 8:
|
|
||||||
* Symbols contained in .paravirtprobe may safely reference .init.text.
|
|
||||||
* The pattern is:
|
|
||||||
* tosec = .init.text
|
|
||||||
* fromsec = .paravirtprobe
|
|
||||||
*
|
|
||||||
* Pattern 10:
|
|
||||||
* ia64 has machvec table for each platform and
|
|
||||||
* powerpc has a machine desc table for each platform.
|
|
||||||
* It is mixture of function pointers of .init.text and .text.
|
|
||||||
* fromsec = .machvec | .machine.desc
|
|
||||||
**/
|
**/
|
||||||
static int secref_whitelist(const char *modname, const char *tosec,
|
static int secref_whitelist(const char *modname, const char *tosec,
|
||||||
const char *fromsec, const char *atsym,
|
const char *fromsec, const char *atsym,
|
||||||
|
@ -655,12 +635,12 @@ static int secref_whitelist(const char *modname, const char *tosec,
|
||||||
const char *pat2sym[] = {
|
const char *pat2sym[] = {
|
||||||
"driver",
|
"driver",
|
||||||
"_template", /* scsi uses *_template a lot */
|
"_template", /* scsi uses *_template a lot */
|
||||||
|
"_timer", /* arm uses ops structures named _timer a lot */
|
||||||
"_sht", /* scsi also used *_sht to some extent */
|
"_sht", /* scsi also used *_sht to some extent */
|
||||||
"_ops",
|
"_ops",
|
||||||
"_probe",
|
"_probe",
|
||||||
"_probe_one",
|
"_probe_one",
|
||||||
"_console",
|
"_console",
|
||||||
"apic_es7000",
|
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -692,7 +672,9 @@ static int secref_whitelist(const char *modname, const char *tosec,
|
||||||
(strcmp(tosec, ".exit.text") != 0) &&
|
(strcmp(tosec, ".exit.text") != 0) &&
|
||||||
(strcmp(tosec, ".init.data") != 0))
|
(strcmp(tosec, ".init.data") != 0))
|
||||||
f2 = 0;
|
f2 = 0;
|
||||||
if (strcmp(fromsec, ".data") != 0)
|
if ((strcmp(fromsec, ".data") != 0) &&
|
||||||
|
(strcmp(fromsec, ".data.rel") != 0) &&
|
||||||
|
(strncmp(fromsec, ".data.rel.", strlen(".data.rel.")) != 0))
|
||||||
f2 = 0;
|
f2 = 0;
|
||||||
|
|
||||||
for (s = pat2sym; *s; s++)
|
for (s = pat2sym; *s; s++)
|
||||||
|
@ -702,37 +684,16 @@ static int secref_whitelist(const char *modname, const char *tosec,
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Check for pattern 3 */
|
/* Check for pattern 3 */
|
||||||
if ((strncmp(fromsec, ".pci_fixup", strlen(".pci_fixup")) == 0) &&
|
|
||||||
(strcmp(tosec, ".init.text") == 0))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* Check for pattern 4 */
|
|
||||||
if ((strcmp(fromsec, ".text.head") == 0) &&
|
if ((strcmp(fromsec, ".text.head") == 0) &&
|
||||||
((strcmp(tosec, ".init.data") == 0) ||
|
((strcmp(tosec, ".init.data") == 0) ||
|
||||||
(strcmp(tosec, ".init.text") == 0)))
|
(strcmp(tosec, ".init.text") == 0)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Check for pattern 5 */
|
/* Check for pattern 4 */
|
||||||
for (s = pat3refsym; *s; s++)
|
for (s = pat3refsym; *s; s++)
|
||||||
if (strcmp(refsymname, *s) == 0)
|
if (strcmp(refsymname, *s) == 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Check for pattern 7 */
|
|
||||||
if ((strcmp(tosec, ".init.data") == 0) &&
|
|
||||||
(strncmp(fromsec, ".text", strlen(".text")) == 0) &&
|
|
||||||
(strncmp(refsymname, "logo_", strlen("logo_")) == 0))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* Check for pattern 8 */
|
|
||||||
if ((strcmp(tosec, ".init.text") == 0) &&
|
|
||||||
(strcmp(fromsec, ".paravirtprobe") == 0))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* Check for pattern 10 */
|
|
||||||
if ((strcmp(fromsec, ".machvec") == 0) ||
|
|
||||||
(strcmp(fromsec, ".machine.desc") == 0))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -753,6 +714,8 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr,
|
||||||
for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
|
for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
|
||||||
if (sym->st_shndx != relsym->st_shndx)
|
if (sym->st_shndx != relsym->st_shndx)
|
||||||
continue;
|
continue;
|
||||||
|
if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
|
||||||
|
continue;
|
||||||
if (sym->st_value == addr)
|
if (sym->st_value == addr)
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
@ -864,11 +827,6 @@ static void warn_sec_mismatch(const char *modname, const char *fromsec,
|
||||||
elf->strtab + before->st_name, refsymname))
|
elf->strtab + before->st_name, refsymname))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* fromsec whitelist - without a valid 'before'
|
|
||||||
* powerpc has a GOT table in .got2 section */
|
|
||||||
if (strcmp(fromsec, ".got2") == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (before && after) {
|
if (before && after) {
|
||||||
warn("%s(%s+0x%llx): Section mismatch: reference to %s:%s "
|
warn("%s(%s+0x%llx): Section mismatch: reference to %s:%s "
|
||||||
"(between '%s' and '%s')\n",
|
"(between '%s' and '%s')\n",
|
||||||
|
@ -895,6 +853,78 @@ static void warn_sec_mismatch(const char *modname, const char *fromsec,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int *reloc_location(struct elf_info *elf,
|
||||||
|
int rsection, Elf_Rela *r)
|
||||||
|
{
|
||||||
|
Elf_Shdr *sechdrs = elf->sechdrs;
|
||||||
|
int section = sechdrs[rsection].sh_info;
|
||||||
|
|
||||||
|
return (void *)elf->hdr + sechdrs[section].sh_offset +
|
||||||
|
(r->r_offset - sechdrs[section].sh_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int addend_386_rel(struct elf_info *elf, int rsection, Elf_Rela *r)
|
||||||
|
{
|
||||||
|
unsigned int r_typ = ELF_R_TYPE(r->r_info);
|
||||||
|
unsigned int *location = reloc_location(elf, rsection, r);
|
||||||
|
|
||||||
|
switch (r_typ) {
|
||||||
|
case R_386_32:
|
||||||
|
r->r_addend = TO_NATIVE(*location);
|
||||||
|
break;
|
||||||
|
case R_386_PC32:
|
||||||
|
r->r_addend = TO_NATIVE(*location) + 4;
|
||||||
|
/* For CONFIG_RELOCATABLE=y */
|
||||||
|
if (elf->hdr->e_type == ET_EXEC)
|
||||||
|
r->r_addend += r->r_offset;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int addend_arm_rel(struct elf_info *elf, int rsection, Elf_Rela *r)
|
||||||
|
{
|
||||||
|
unsigned int r_typ = ELF_R_TYPE(r->r_info);
|
||||||
|
|
||||||
|
switch (r_typ) {
|
||||||
|
case R_ARM_ABS32:
|
||||||
|
/* From ARM ABI: (S + A) | T */
|
||||||
|
r->r_addend = (int)(long)(elf->symtab_start + ELF_R_SYM(r->r_info));
|
||||||
|
break;
|
||||||
|
case R_ARM_PC24:
|
||||||
|
/* From ARM ABI: ((S + A) | T) - P */
|
||||||
|
r->r_addend = (int)(long)(elf->hdr + elf->sechdrs[rsection].sh_offset +
|
||||||
|
(r->r_offset - elf->sechdrs[rsection].sh_addr));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int addend_mips_rel(struct elf_info *elf, int rsection, Elf_Rela *r)
|
||||||
|
{
|
||||||
|
unsigned int r_typ = ELF_R_TYPE(r->r_info);
|
||||||
|
unsigned int *location = reloc_location(elf, rsection, r);
|
||||||
|
unsigned int inst;
|
||||||
|
|
||||||
|
if (r_typ == R_MIPS_HI16)
|
||||||
|
return 1; /* skip this */
|
||||||
|
inst = TO_NATIVE(*location);
|
||||||
|
switch (r_typ) {
|
||||||
|
case R_MIPS_LO16:
|
||||||
|
r->r_addend = inst & 0xffff;
|
||||||
|
break;
|
||||||
|
case R_MIPS_26:
|
||||||
|
r->r_addend = (inst & 0x03ffffff) << 2;
|
||||||
|
break;
|
||||||
|
case R_MIPS_32:
|
||||||
|
r->r_addend = inst;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A module includes a number of sections that are discarded
|
* A module includes a number of sections that are discarded
|
||||||
* either when loaded or when used as built-in.
|
* either when loaded or when used as built-in.
|
||||||
|
@ -938,8 +968,11 @@ static void check_sec_ref(struct module *mod, const char *modname,
|
||||||
r.r_offset = TO_NATIVE(rela->r_offset);
|
r.r_offset = TO_NATIVE(rela->r_offset);
|
||||||
#if KERNEL_ELFCLASS == ELFCLASS64
|
#if KERNEL_ELFCLASS == ELFCLASS64
|
||||||
if (hdr->e_machine == EM_MIPS) {
|
if (hdr->e_machine == EM_MIPS) {
|
||||||
|
unsigned int r_typ;
|
||||||
r_sym = ELF64_MIPS_R_SYM(rela->r_info);
|
r_sym = ELF64_MIPS_R_SYM(rela->r_info);
|
||||||
r_sym = TO_NATIVE(r_sym);
|
r_sym = TO_NATIVE(r_sym);
|
||||||
|
r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
|
||||||
|
r.r_info = ELF64_R_INFO(r_sym, r_typ);
|
||||||
} else {
|
} else {
|
||||||
r.r_info = TO_NATIVE(rela->r_info);
|
r.r_info = TO_NATIVE(rela->r_info);
|
||||||
r_sym = ELF_R_SYM(r.r_info);
|
r_sym = ELF_R_SYM(r.r_info);
|
||||||
|
@ -972,8 +1005,11 @@ static void check_sec_ref(struct module *mod, const char *modname,
|
||||||
r.r_offset = TO_NATIVE(rel->r_offset);
|
r.r_offset = TO_NATIVE(rel->r_offset);
|
||||||
#if KERNEL_ELFCLASS == ELFCLASS64
|
#if KERNEL_ELFCLASS == ELFCLASS64
|
||||||
if (hdr->e_machine == EM_MIPS) {
|
if (hdr->e_machine == EM_MIPS) {
|
||||||
|
unsigned int r_typ;
|
||||||
r_sym = ELF64_MIPS_R_SYM(rel->r_info);
|
r_sym = ELF64_MIPS_R_SYM(rel->r_info);
|
||||||
r_sym = TO_NATIVE(r_sym);
|
r_sym = TO_NATIVE(r_sym);
|
||||||
|
r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
|
||||||
|
r.r_info = ELF64_R_INFO(r_sym, r_typ);
|
||||||
} else {
|
} else {
|
||||||
r.r_info = TO_NATIVE(rel->r_info);
|
r.r_info = TO_NATIVE(rel->r_info);
|
||||||
r_sym = ELF_R_SYM(r.r_info);
|
r_sym = ELF_R_SYM(r.r_info);
|
||||||
|
@ -983,6 +1019,20 @@ static void check_sec_ref(struct module *mod, const char *modname,
|
||||||
r_sym = ELF_R_SYM(r.r_info);
|
r_sym = ELF_R_SYM(r.r_info);
|
||||||
#endif
|
#endif
|
||||||
r.r_addend = 0;
|
r.r_addend = 0;
|
||||||
|
switch (hdr->e_machine) {
|
||||||
|
case EM_386:
|
||||||
|
if (addend_386_rel(elf, i, &r))
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
case EM_ARM:
|
||||||
|
if(addend_arm_rel(elf, i, &r))
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
case EM_MIPS:
|
||||||
|
if (addend_mips_rel(elf, i, &r))
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
sym = elf->symtab_start + r_sym;
|
sym = elf->symtab_start + r_sym;
|
||||||
/* Skip special sections */
|
/* Skip special sections */
|
||||||
if (sym->st_shndx >= SHN_LORESERVE)
|
if (sym->st_shndx >= SHN_LORESERVE)
|
||||||
|
@ -998,6 +1048,63 @@ static void check_sec_ref(struct module *mod, const char *modname,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Identify sections from which references to either a
|
||||||
|
* .init or a .exit section is OK.
|
||||||
|
*
|
||||||
|
* [OPD] Keith Ownes <kaos@sgi.com> commented:
|
||||||
|
* For our future {in}sanity, add a comment that this is the ppc .opd
|
||||||
|
* section, not the ia64 .opd section.
|
||||||
|
* ia64 .opd should not point to discarded sections.
|
||||||
|
* [.rodata] like for .init.text we ignore .rodata references -same reason
|
||||||
|
*/
|
||||||
|
static int initexit_section_ref_ok(const char *name)
|
||||||
|
{
|
||||||
|
const char **s;
|
||||||
|
/* Absolute section names */
|
||||||
|
const char *namelist1[] = {
|
||||||
|
"__bug_table", /* used by powerpc for BUG() */
|
||||||
|
"__ex_table",
|
||||||
|
".altinstructions",
|
||||||
|
".cranges", /* used by sh64 */
|
||||||
|
".fixup",
|
||||||
|
".machvec", /* ia64 + powerpc uses these */
|
||||||
|
".machine.desc",
|
||||||
|
".opd", /* See comment [OPD] */
|
||||||
|
".parainstructions",
|
||||||
|
".pdr",
|
||||||
|
".plt", /* seen on ARCH=um build on x86_64. Harmless */
|
||||||
|
".smp_locks",
|
||||||
|
".stab",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
/* Start of section names */
|
||||||
|
const char *namelist2[] = {
|
||||||
|
".debug",
|
||||||
|
".eh_frame",
|
||||||
|
".note", /* ignore ELF notes - may contain anything */
|
||||||
|
".got", /* powerpc - global offset table */
|
||||||
|
".toc", /* powerpc - table of contents */
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
/* part of section name */
|
||||||
|
const char *namelist3 [] = {
|
||||||
|
".unwind", /* Sample: IA_64.unwind.exit.text */
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
for (s = namelist1; *s; s++)
|
||||||
|
if (strcmp(*s, name) == 0)
|
||||||
|
return 1;
|
||||||
|
for (s = namelist2; *s; s++)
|
||||||
|
if (strncmp(*s, name, strlen(*s)) == 0)
|
||||||
|
return 1;
|
||||||
|
for (s = namelist3; *s; s++)
|
||||||
|
if (strstr(name, *s) != NULL)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functions used only during module init is marked __init and is stored in
|
* Functions used only during module init is marked __init and is stored in
|
||||||
* a .init.text section. Likewise data is marked __initdata and stored in
|
* a .init.text section. Likewise data is marked __initdata and stored in
|
||||||
|
@ -1014,7 +1121,7 @@ static int init_section(const char *name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Identify sections from which references to a .init section is OK.
|
* Identify sections from which references to a .init section is OK.
|
||||||
*
|
*
|
||||||
* Unfortunately references to read only data that referenced .init
|
* Unfortunately references to read only data that referenced .init
|
||||||
|
@ -1028,48 +1135,31 @@ static int init_section(const char *name)
|
||||||
*
|
*
|
||||||
* where vgacon_startup is __init. If you want to wade through the false
|
* where vgacon_startup is __init. If you want to wade through the false
|
||||||
* positives, take out the check for rodata.
|
* positives, take out the check for rodata.
|
||||||
**/
|
*/
|
||||||
static int init_section_ref_ok(const char *name)
|
static int init_section_ref_ok(const char *name)
|
||||||
{
|
{
|
||||||
const char **s;
|
const char **s;
|
||||||
/* Absolute section names */
|
/* Absolute section names */
|
||||||
const char *namelist1[] = {
|
const char *namelist1[] = {
|
||||||
".init",
|
"__dbe_table", /* MIPS generate these */
|
||||||
".opd", /* see comment [OPD] at exit_section_ref_ok() */
|
|
||||||
".toc1", /* used by ppc64 */
|
|
||||||
".stab",
|
|
||||||
".data.rel.ro", /* used by parisc64 */
|
|
||||||
".parainstructions",
|
|
||||||
".text.lock",
|
|
||||||
"__bug_table", /* used by powerpc for BUG() */
|
|
||||||
".pci_fixup_header",
|
|
||||||
".pci_fixup_final",
|
|
||||||
".pdr",
|
|
||||||
"__param",
|
|
||||||
"__ex_table",
|
|
||||||
".fixup",
|
|
||||||
".smp_locks",
|
|
||||||
".plt", /* seen on ARCH=um build on x86_64. Harmless */
|
|
||||||
"__ftr_fixup", /* powerpc cpu feature fixup */
|
"__ftr_fixup", /* powerpc cpu feature fixup */
|
||||||
"__fw_ftr_fixup", /* powerpc firmware feature fixup */
|
"__fw_ftr_fixup", /* powerpc firmware feature fixup */
|
||||||
".cranges", /* used by sh64 */
|
"__param",
|
||||||
|
".data.rel.ro", /* used by parisc64 */
|
||||||
|
".init",
|
||||||
|
".text.lock",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
/* Start of section names */
|
/* Start of section names */
|
||||||
const char *namelist2[] = {
|
const char *namelist2[] = {
|
||||||
".init.",
|
".init.",
|
||||||
".altinstructions",
|
".pci_fixup",
|
||||||
".eh_frame",
|
|
||||||
".debug",
|
|
||||||
".parainstructions",
|
|
||||||
".rodata",
|
".rodata",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
/* part of section name */
|
|
||||||
const char *namelist3 [] = {
|
if (initexit_section_ref_ok(name))
|
||||||
".unwind", /* sample: IA_64.unwind.init.text */
|
return 1;
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
for (s = namelist1; *s; s++)
|
for (s = namelist1; *s; s++)
|
||||||
if (strcmp(*s, name) == 0)
|
if (strcmp(*s, name) == 0)
|
||||||
|
@ -1077,9 +1167,10 @@ static int init_section_ref_ok(const char *name)
|
||||||
for (s = namelist2; *s; s++)
|
for (s = namelist2; *s; s++)
|
||||||
if (strncmp(*s, name, strlen(*s)) == 0)
|
if (strncmp(*s, name, strlen(*s)) == 0)
|
||||||
return 1;
|
return 1;
|
||||||
for (s = namelist3; *s; s++)
|
|
||||||
if (strstr(name, *s) != NULL)
|
/* If section name ends with ".init" we allow references
|
||||||
return 1;
|
* as is the case with .initcallN.init, .early_param.init, .taglist.init etc
|
||||||
|
*/
|
||||||
if (strrcmp(name, ".init") == 0)
|
if (strrcmp(name, ".init") == 0)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1104,58 +1195,25 @@ static int exit_section(const char *name)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Identify sections from which references to a .exit section is OK.
|
* Identify sections from which references to a .exit section is OK.
|
||||||
*
|
*/
|
||||||
* [OPD] Keith Ownes <kaos@sgi.com> commented:
|
|
||||||
* For our future {in}sanity, add a comment that this is the ppc .opd
|
|
||||||
* section, not the ia64 .opd section.
|
|
||||||
* ia64 .opd should not point to discarded sections.
|
|
||||||
* [.rodata] like for .init.text we ignore .rodata references -same reason
|
|
||||||
**/
|
|
||||||
static int exit_section_ref_ok(const char *name)
|
static int exit_section_ref_ok(const char *name)
|
||||||
{
|
{
|
||||||
const char **s;
|
const char **s;
|
||||||
/* Absolute section names */
|
/* Absolute section names */
|
||||||
const char *namelist1[] = {
|
const char *namelist1[] = {
|
||||||
".exit.text",
|
|
||||||
".exit.data",
|
".exit.data",
|
||||||
".init.text",
|
".exit.text",
|
||||||
".rodata",
|
|
||||||
".opd", /* See comment [OPD] */
|
|
||||||
".toc1", /* used by ppc64 */
|
|
||||||
".altinstructions",
|
|
||||||
".pdr",
|
|
||||||
"__bug_table", /* used by powerpc for BUG() */
|
|
||||||
".exitcall.exit",
|
".exitcall.exit",
|
||||||
".eh_frame",
|
".rodata",
|
||||||
".parainstructions",
|
|
||||||
".stab",
|
|
||||||
"__ex_table",
|
|
||||||
".fixup",
|
|
||||||
".smp_locks",
|
|
||||||
".plt", /* seen on ARCH=um build on x86_64. Harmless */
|
|
||||||
".cranges", /* used by sh64 */
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
/* Start of section names */
|
|
||||||
const char *namelist2[] = {
|
|
||||||
".debug",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
/* part of section name */
|
|
||||||
const char *namelist3 [] = {
|
|
||||||
".unwind", /* Sample: IA_64.unwind.exit.text */
|
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (initexit_section_ref_ok(name))
|
||||||
|
return 1;
|
||||||
|
|
||||||
for (s = namelist1; *s; s++)
|
for (s = namelist1; *s; s++)
|
||||||
if (strcmp(*s, name) == 0)
|
if (strcmp(*s, name) == 0)
|
||||||
return 1;
|
return 1;
|
||||||
for (s = namelist2; *s; s++)
|
|
||||||
if (strncmp(*s, name, strlen(*s)) == 0)
|
|
||||||
return 1;
|
|
||||||
for (s = namelist3; *s; s++)
|
|
||||||
if (strstr(name, *s) != NULL)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,9 @@ typedef union
|
||||||
#define ELF64_MIPS_R_SYM(i) \
|
#define ELF64_MIPS_R_SYM(i) \
|
||||||
((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym)
|
((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym)
|
||||||
|
|
||||||
|
#define ELF64_MIPS_R_TYPE(i) \
|
||||||
|
((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type1)
|
||||||
|
|
||||||
#if KERNEL_ELFDATA != HOST_ELFDATA
|
#if KERNEL_ELFDATA != HOST_ELFDATA
|
||||||
|
|
||||||
static inline void __endian(const void *src, void *dest, unsigned int size)
|
static inline void __endian(const void *src, void *dest, unsigned int size)
|
||||||
|
|
|
@ -498,7 +498,9 @@ int main (int argc, char *argv[])
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! (cpio_list = fopen(argv[1], "r"))) {
|
if (!strcmp(argv[1], "-"))
|
||||||
|
cpio_list = stdin;
|
||||||
|
else if (! (cpio_list = fopen(argv[1], "r"))) {
|
||||||
fprintf(stderr, "ERROR: unable to open '%s': %s\n\n",
|
fprintf(stderr, "ERROR: unable to open '%s': %s\n\n",
|
||||||
argv[1], strerror(errno));
|
argv[1], strerror(errno));
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче