Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
cce4ae63
Commit
cce4ae63
authored
Sep 10, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux-sam.bkbits.net/kbuild
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
c293b633
138aa1d2
Changes
21
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
688 additions
and
157 deletions
+688
-157
Documentation/kbuild/makefiles.txt
Documentation/kbuild/makefiles.txt
+0
-9
Makefile
Makefile
+172
-112
arch/arm/Makefile
arch/arm/Makefile
+0
-1
arch/arm26/Makefile
arch/arm26/Makefile
+0
-2
arch/arm26/boot/Makefile
arch/arm26/boot/Makefile
+2
-2
arch/cris/Makefile
arch/cris/Makefile
+0
-2
arch/ppc/Makefile
arch/ppc/Makefile
+3
-1
arch/ppc/boot/utils/mkbugboot.c
arch/ppc/boot/utils/mkbugboot.c
+6
-6
arch/ppc/boot/utils/mktree.c
arch/ppc/boot/utils/mktree.c
+4
-0
arch/um/Makefile-i386
arch/um/Makefile-i386
+0
-1
init/Kconfig
init/Kconfig
+10
-0
scripts/Makefile.build
scripts/Makefile.build
+3
-3
scripts/Makefile.modinst
scripts/Makefile.modinst
+1
-1
scripts/Makefile.modpost
scripts/Makefile.modpost
+1
-1
scripts/genksyms/genksyms.c
scripts/genksyms/genksyms.c
+15
-0
scripts/kconfig/gconf.c
scripts/kconfig/gconf.c
+2
-3
scripts/mod/sumversion.c
scripts/mod/sumversion.c
+4
-0
scripts/namespace.pl
scripts/namespace.pl
+449
-0
scripts/package/builddeb
scripts/package/builddeb
+1
-1
scripts/package/mkspec
scripts/package/mkspec
+10
-10
scripts/ver_linux
scripts/ver_linux
+5
-2
No files found.
Documentation/kbuild/makefiles.txt
View file @
cce4ae63
...
@@ -664,15 +664,6 @@ When kbuild executes the following steps are followed (roughly):
...
@@ -664,15 +664,6 @@ When kbuild executes the following steps are followed (roughly):
#arch/i386/Makefile
#arch/i386/Makefile
LDFLAGS_vmlinux := -e stext
LDFLAGS_vmlinux := -e stext
LDFLAGS_BLOB Options for $(LD) when linking the initramfs blob
The image used for initramfs is made during the build process.
LDFLAGS_BLOB is used to specify additional flags to be used when
creating the initramfs_data.o file.
Example:
#arch/i386/Makefile
LDFLAGS_BLOB := --format binary --oformat elf32-i386
OBJCOPYFLAGS objcopy flags
OBJCOPYFLAGS objcopy flags
When $(call if_changed,objcopy) is used to translate a .o file,
When $(call if_changed,objcopy) is used to translate a .o file,
...
...
Makefile
View file @
cce4ae63
...
@@ -141,7 +141,25 @@ VPATH := $(srctree)
...
@@ -141,7 +141,25 @@ VPATH := $(srctree)
export
srctree
objtree
VPATH
TOPDIR
export
srctree
objtree
VPATH
TOPDIR
KERNELRELEASE
=
$(VERSION)
.
$(PATCHLEVEL)
.
$(SUBLEVEL)$(EXTRAVERSION)
nullstring
:=
space
:=
$(nullstring)
# end of line
# Take the contents of any files called localversion* and the config
# variable CONFIG_LOCALVERSION and append them to KERNELRELEASE. Be
# careful not to include files twice if building in the source
# directory. LOCALVERSION from the command line override all of this
ifeq
($(objtree),$(srctree))
localversion-files
:=
$(
wildcard
$(srctree)
/localversion
*
)
else
localversion-files
:=
$(
wildcard
$(objtree)
/localversion
*
$(srctree)
/localversion
*
)
endif
LOCALVERSION
=
$(
subst
$(space)
,,
\
$(
shell
cat
/dev/null
$
(
localversion-files
))
\
$(
subst
",,
$(CONFIG_LOCALVERSION)
))
KERNELRELEASE
=
$(VERSION)
.
$(PATCHLEVEL)
.
$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)
# SUBARCH tells the usermode build what the underlying arch is. That is set
# SUBARCH tells the usermode build what the underlying arch is. That is set
# first, and if a usermode build is happening, the "ARCH=um" on the command
# first, and if a usermode build is happening, the "ARCH=um" on the command
...
@@ -329,10 +347,10 @@ CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs \
...
@@ -329,10 +347,10 @@ CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common
-fno-strict-aliasing -fno-common
AFLAGS
:=
-D__ASSEMBLY__
AFLAGS
:=
-D__ASSEMBLY__
export
VERSION
PATCHLEVEL
SUBLEVEL
EXTRAVERSION
KERNELRELEASE
ARCH
\
export
VERSION
PATCHLEVEL
SUBLEVEL
EXTRAVERSION
LOCALVERSION
KERNELRELEASE
\
CONFIG_SHELL
HOSTCC
HOSTCFLAGS
CROSS_COMPILE
AS
LD
CC
\
ARCH
CONFIG_SHELL
HOSTCC
HOSTCFLAGS
CROSS_COMPILE
AS
LD
CC
\
CPP
AR
NM
STRIP
OBJCOPY
OBJDUMP
MAKE
AWK
GENKSYMS
PERL
UTS_MACHINE
\
CPP
AR
NM
STRIP
OBJCOPY
OBJDUMP
MAKE
AWK
GENKSYMS
PERL
UTS_MACHINE
\
HOSTCXX
HOSTCXXFLAGS
LDFLAGS_
BLOB
LDFLAGS_
MODULE
CHECK
CHECKFLAGS
HOSTCXX
HOSTCXXFLAGS
LDFLAGS_MODULE
CHECK
CHECKFLAGS
export
CPPFLAGS
NOSTDINC_FLAGS
LINUXINCLUDE
OBJCOPYFLAGS
LDFLAGS
export
CPPFLAGS
NOSTDINC_FLAGS
LINUXINCLUDE
OBJCOPYFLAGS
LDFLAGS
export
CFLAGS
CFLAGS_KERNEL
CFLAGS_MODULE
export
CFLAGS
CFLAGS_KERNEL
CFLAGS_MODULE
...
@@ -456,15 +474,6 @@ else
...
@@ -456,15 +474,6 @@ else
include/linux/autoconf.h
:
;
include/linux/autoconf.h
:
;
endif
endif
include
$(srctree)/arch/$(ARCH)/Makefile
# Default kernel image to build when no specific target is given.
# KBUILD_IMAGE may be overruled on the commandline or
# set in the environment
# Also any assingments in arch/$(ARCH)/Makefiel take precedence over
# this default value
export
KBUILD_IMAGE
?=
vmlinux
# The all: target is the default when no target is given on the
# The all: target is the default when no target is given on the
# command line.
# command line.
# This allow a user to issue only 'make' to build a kernel including modules
# This allow a user to issue only 'make' to build a kernel including modules
...
@@ -488,6 +497,15 @@ endif
...
@@ -488,6 +497,15 @@ endif
# warn about C99 declaration after statement
# warn about C99 declaration after statement
CFLAGS
+=
$(
call
cc-option,-Wdeclaration-after-statement,
)
CFLAGS
+=
$(
call
cc-option,-Wdeclaration-after-statement,
)
include
$(srctree)/arch/$(ARCH)/Makefile
# Default kernel image to build when no specific target is given.
# KBUILD_IMAGE may be overruled on the commandline or
# set in the environment
# Also any assingments in arch/$(ARCH)/Makefiel take precedence over
# this default value
export
KBUILD_IMAGE
?=
vmlinux
#
#
# INSTALL_PATH specifies where to place the updated kernel and system map
# INSTALL_PATH specifies where to place the updated kernel and system map
# images. Uncomment if you want to place them anywhere other than root.
# images. Uncomment if you want to place them anywhere other than root.
...
@@ -527,67 +545,93 @@ libs-y := $(libs-y1) $(libs-y2)
...
@@ -527,67 +545,93 @@ libs-y := $(libs-y1) $(libs-y2)
# Build vmlinux
# Build vmlinux
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# vmlinux is build from the objects selected by $(vmlinux-init) and
# $(vmlinux-main). Most are built-in.o files from top-level directories
# in the kernel tree, others are specified in arch/$(ARCH)Makefile.
# Ordering when linking is important, and $(vmlinux-init) must be first.
#
# vmlinux
# ^
# |
# +-< $(vmlinux-init)
# | +--< init/version.o + more
# |
# +--< $(vmlinux-main)
# | +--< driver/built-in.o mm/built-in.o + more
# |
# +-< kallsyms.o (see description in CONFIG_KALLSYMS section)
#
# vmlinux version (uname -v) cannot be updated during normal
# descending-into-subdirs phase since we do not yet know if we need to
# update vmlinux.
# Therefore this step is delayed until just before final link of vmlinux -
# except in the kallsyms case where it is done just before adding the
# symbols to the kernel.
#
# System.map is generated to document addresses of all kernel symbols
vmlinux-init
:=
$
(
head-y
)
$
(
init-y
)
vmlinux-main
:=
$
(
core-y
)
$
(
libs-y
)
$
(
drivers-y
)
$
(
net-y
)
vmlinux-all
:=
$
(
vmlinux-init
)
$
(
vmlinux-main
)
vmlinux-lds
:=
arch
/
$(ARCH)
/kernel/vmlinux.lds
# Rule to link vmlinux - also used during CONFIG_KALLSYMS
# May be overridden by arch/$(ARCH)/Makefile
quiet_cmd_vmlinux__
?=
LD
$@
cmd_vmlinux__
?=
$(LD)
$(LDFLAGS)
$(LDFLAGS_vmlinux)
-o
$@
\
-T
$
(
vmlinux-lds
)
$
(
vmlinux-init
)
\
--start-group
$
(
vmlinux-main
)
--end-group
\
$(
filter-out
$
(
vmlinux-lds
)
$
(
vmlinux-init
)
$
(
vmlinux-main
)
FORCE ,
$^
)
# Generate new vmlinux version
quiet_cmd_vmlinux_version
=
GEN .version
cmd_vmlinux_version
=
set
-e
;
\
.
$(srctree)
/scripts/mkversion
>
.tmp_version
;
\
mv
-f
.tmp_version .version
;
\
$(MAKE)
$(build)
=
init
# Generate System.map
quiet_cmd_sysmap
=
SYSMAP
cmd_sysmap
=
$(CONFIG_SHELL)
$(srctree)
/scripts/mksysmap
# This is a bit tricky: If we need to relink vmlinux, we want
# Link of vmlinux
# the version number incremented, which means recompile init/version.o
# If CONFIG_KALLSYMS is set .version is already updated
# and relink init/init.o. However, we cannot do this during the
# Generate System.map and verify that the content is consistent
# normal descending-into-subdirs phase, since at that time
# we cannot yet know if we will need to relink vmlinux.
# So we descend into init/ inside the rule for vmlinux again.
vmlinux-objs
:=
$
(
head-y
)
$
(
init-y
)
$
(
core-y
)
$
(
libs-y
)
$
(
drivers-y
)
$
(
net-y
)
quiet_cmd_vmlinux__
=
LD
$@
define
cmd_vmlinux__
$(LD)
$(LDFLAGS)
$(LDFLAGS_vmlinux)
$(head-y)
$(init-y)
\
--start-group
\
$(core-y)
\
$(libs-y)
\
$(drivers-y)
\
$(net-y)
\
--end-group
\
$(filter
.tmp_kallsyms%,$^)
\
-o
$@
endef
# set -e makes the rule exit immediately on error
define
rule_vmlinux__
define
rule_vmlinux__
+set
-e;
\
$(if
$(CONFIG_KALLSYMS),,+$(call
cmd,vmlinux_version))
$(if
$(filter
.tmp_kallsyms%,$^),,
\
echo
' GEN .version'
;
\
$(call
cmd,vmlinux__)
.
$(srctree)/scripts/mkversion
>
.tmp_version;
\
$(Q)echo 'cmd_$@
:
= $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
mv
-f
.tmp_version
.version;
\
$(MAKE)
$(build)
=
init
;
\
$(Q)$(if
$($(quiet)cmd_sysmap),
\
)
\
echo
' $($(quiet)cmd_sysmap) System.map'
&&)
\
$(
if
$
(
$(quiet)
cmd_vmlinux__
)
,
\
$(cmd_sysmap)
$@
System.map;
\
echo
' $(
$(quiet)
cmd_vmlinux__
)
'
&&
)
\
if
[
$$?
-ne
0
];
then
\
$(cmd_vmlinux__)
;
\
rm
-f
$@;
\
echo
'cmd_$@ :=
$(cmd_vmlinux__)
'
>
$
(
@D
)
/.
$
(
@F
)
.cmd
/bin/false;
\
fi;
$(verify_kallsyms)
endef
endef
quiet_cmd_sysmap
=
SYSMAP
cmd_sysmap
=
$(CONFIG_SHELL)
$(srctree)
/scripts/mksysmap
LDFLAGS_vmlinux
+=
-T
arch
/
$(ARCH)
/kernel/vmlinux.lds
# Generate section listing all symbols and add it into vmlinux
# It's a three stage process:
# o .tmp_vmlinux1 has all symbols and sections, but __kallsyms is
# empty
# Running kallsyms on that gives us .tmp_kallsyms1.o with
# the right size
# o .tmp_vmlinux2 now has a __kallsyms section of the right size,
# but due to the added section, some addresses have shifted
# From here, we generate a correct .tmp_kallsyms2.o
# o The correct .tmp_kallsyms2.o is linked into the final vmlinux.
# o Verify that the System.map from vmlinux matches the map from
# .tmp_vmlinux2, just in case we did not generate kallsyms correctly.
# o If CONFIG_KALLSYMS_EXTRA_PASS is set, do an extra pass using
# .tmp_vmlinux3 and .tmp_kallsyms3.o. This is only meant as a
# temporary bypass to allow the kernel to be built while the
# maintainers work out what went wrong with kallsyms.
ifdef
CONFIG_KALLSYMS
ifdef
CONFIG_KALLSYMS
# Generate section listing all symbols and add it into vmlinux $(kallsyms.o)
# It's a three stage process:
# o .tmp_vmlinux1 has all symbols and sections, but __kallsyms is
# empty
# Running kallsyms on that gives us .tmp_kallsyms1.o with
# the right size - vmlinux version (uname -v) is updated during this step
# o .tmp_vmlinux2 now has a __kallsyms section of the right size,
# but due to the added section, some addresses have shifted.
# From here, we generate a correct .tmp_kallsyms2.o
# o The correct .tmp_kallsyms2.o is linked into the final vmlinux.
# o Verify that the System.map from vmlinux matches the map from
# .tmp_vmlinux2, just in case we did not generate kallsyms correctly.
# o If CONFIG_KALLSYMS_EXTRA_PASS is set, do an extra pass using
# .tmp_vmlinux3 and .tmp_kallsyms3.o. This is only meant as a
# temporary bypass to allow the kernel to be built while the
# maintainers work out what went wrong with kallsyms.
ifdef
CONFIG_KALLSYMS_EXTRA_PASS
ifdef
CONFIG_KALLSYMS_EXTRA_PASS
last_kallsyms
:=
3
last_kallsyms
:=
3
...
@@ -597,16 +641,29 @@ endif
...
@@ -597,16 +641,29 @@ endif
kallsyms.o
:=
.tmp_kallsyms
$(last_kallsyms)
.o
kallsyms.o
:=
.tmp_kallsyms
$(last_kallsyms)
.o
define
rule_
verify_kallsyms
define
verify_kallsyms
$(Q)$(if
$($(quiet)cmd_sysmap),
\
$(Q)$(if
$($(quiet)cmd_sysmap),
\
echo
' $($(quiet)cmd_sysmap) .tmp_System.map'
&&)
\
echo
' $($(quiet)cmd_sysmap) .tmp_System.map'
&&)
\
$(cmd_sysmap)
.tmp_vmlinux$(last_kallsyms)
.tmp_System.map
$(cmd_sysmap)
.tmp_vmlinux$(last_kallsyms)
.tmp_System.map
$(Q)cmp
-s
System.map
.tmp_System.map
||
\
$(Q)cmp
-s
System.map
.tmp_System.map
||
\
(echo
Inconsistent
kallsyms
data,
try
setting
CONFIG_KALLSYMS_EXTRA_PASS
;
rm
.tmp_kallsyms*
;
false)
(echo
Inconsistent
kallsyms
data;
\
echo
Try
setting
CONFIG_KALLSYMS_EXTRA_PASS;
\
rm
.tmp_kallsyms*
;
/bin/false
)
endef
# Update vmlinux version before link
# Use + in front of this rule to silent warning about make -j1
cmd_ksym_ld
=
$(cmd_vmlinux__)
define
rule_ksym_ld
+$(call
cmd,vmlinux_version)
$(call
cmd,vmlinux__)
$(Q)echo 'cmd_$@
:
= $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
endef
endef
# Generate .S file with all kernel symbols
quiet_cmd_kallsyms
=
KSYM
$@
quiet_cmd_kallsyms
=
KSYM
$@
cmd_kallsyms
=
$(NM)
-n
$<
|
$(KALLSYMS)
$(
foreach
x,
$(CONFIG_KALLSYMS_ALL)
,--all-symbols
)
>
$@
cmd_kallsyms
=
$(NM)
-n
$<
|
$(KALLSYMS)
\
$(
if
$(CONFIG_KALLSYMS_ALL)
,--all-symbols
)
>
$@
.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o
:
%.o: %.S scripts FORCE
.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o
:
%.o: %.S scripts FORCE
$(
call
if_changed_dep,as_o_S
)
$(
call
if_changed_dep,as_o_S
)
...
@@ -614,43 +671,28 @@ cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) $(foreach x,$(CONFIG_KALLSYMS_ALL),--al
...
@@ -614,43 +671,28 @@ cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) $(foreach x,$(CONFIG_KALLSYMS_ALL),--al
.tmp_kallsyms%.S
:
.tmp_vmlinux% $(KALLSYMS)
.tmp_kallsyms%.S
:
.tmp_vmlinux% $(KALLSYMS)
$(
call
cmd,kallsyms
)
$(
call
cmd,kallsyms
)
.tmp_vmlinux1
:
$(vmlinux-objs) arch/$(ARCH)/kernel/vmlinux.lds FORCE
# .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
$(
call
if_changed_rule,vmlinux__
)
.tmp_vmlinux1
:
$(vmlinux-lds) $(vmlinux-all) FORCE
$(
call
if_changed_rule,ksym_ld
)
.tmp_vmlinux2
:
$(vmlinux-
objs) .tmp_kallsyms1.o arch/$(ARCH)/kernel/vmlinux.lds
FORCE
.tmp_vmlinux2
:
$(vmlinux-
lds) $(vmlinux-all) .tmp_kallsyms1.o
FORCE
$(
call
if_changed
_rule
,vmlinux__
)
$(
call
if_changed,vmlinux__
)
.tmp_vmlinux3
:
$(vmlinux-
objs) .tmp_kallsyms2.o arch/$(ARCH)/kernel/vmlinux.lds
FORCE
.tmp_vmlinux3
:
$(vmlinux-
lds) $(vmlinux-all) .tmp_kallsyms2.o
FORCE
$(
call
if_changed
_rule
,vmlinux__
)
$(
call
if_changed,vmlinux__
)
# Needs to visit scripts/ before $(KALLSYMS) can be used.
# Needs to visit scripts/ before $(KALLSYMS) can be used.
$(KALLSYMS)
:
scripts ;
$(KALLSYMS)
:
scripts ;
endif
endif
# ifdef CONFIG_KALLSYMS
# Finally the vmlinux rule
# This rule is also used to generate System.map
# and to verify that the content of kallsyms are consistent
define
rule_vmlinux
$(rule_vmlinux__);
$(Q)$(if
$($(quiet)cmd_sysmap),
\
echo
' $($(quiet)cmd_sysmap) System.map'
&&)
\
$(cmd_sysmap)
$@
System.map;
\
if
[
$$?
-ne
0
];
then
\
rm
-f
$@;
\
/bin/false;
\
fi;
$(rule_verify_kallsyms)
endef
vmlinux
:
$(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/kernel/vmlinux.lds FORCE
# vmlinux image - including updated kernel symbols
$(
call
if_changed_rule,vmlinux
)
vmlinux
:
$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
$(
call
if_changed_rule,vmlinux__
)
# The actual objects are generated when descending,
# make sure no implicit rule kicks in
$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds
:
$(vmlinux-dirs) ;
# The actual objects are generated when descending,
# make sure no implicit rule kicks in
$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds)
:
$(vmlinux-dirs) ;
# Handle descending into subdirectories listed in $(vmlinux-dirs)
# Handle descending into subdirectories listed in $(vmlinux-dirs)
# Preset locale variables to speed up the build process. Limit locale
# Preset locale variables to speed up the build process. Limit locale
...
@@ -673,10 +715,10 @@ $(vmlinux-dirs): prepare-all scripts
...
@@ -673,10 +715,10 @@ $(vmlinux-dirs): prepare-all scripts
# using a seperate output directory. This allows convinient use
# using a seperate output directory. This allows convinient use
# of make in output directory
# of make in output directory
prepare2
:
prepare2
:
$(Q)
if
[
!
$(srctree)
-ef
$(objtree)
]
;
then
\
$(Q)
if
/usr/bin/env
test
!
$(srctree)
-ef
$(objtree)
;
then
\
$(CONFIG_SHELL)
$(srctree)
/scripts/mkmakefile
\
$(CONFIG_SHELL)
$(srctree)
/scripts/mkmakefile
\
$(srctree)
$(objtree)
$(VERSION)
$(PATCHLEVEL)
\
$(srctree)
$(objtree)
$(VERSION)
$(PATCHLEVEL)
\
>
$(objtree)
/Makefile
;
\
>
$(objtree)
/Makefile
;
\
fi
fi
# prepare1 is used to check if we are building in a separate output directory,
# prepare1 is used to check if we are building in a separate output directory,
...
@@ -747,8 +789,8 @@ include/config/MARKER: include/linux/autoconf.h
...
@@ -747,8 +789,8 @@ include/config/MARKER: include/linux/autoconf.h
# Generate some files
# Generate some files
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
#
version.h changes when $(KERNELRELEASE) etc change, as defined in
#
KERNELRELEASE can change from a few different places, meaning version.h
#
this Makefile
#
needs to be updated, so this check is forced on all builds
uts_len
:=
64
uts_len
:=
64
...
@@ -763,7 +805,7 @@ define filechk_version.h
...
@@ -763,7 +805,7 @@ define filechk_version.h
)
)
endef
endef
include/linux/version.h
:
Makefile
include/linux/version.h
:
$(srctree)/Makefile FORCE
$(
call
filechk,version.h
)
$(
call
filechk,version.h
)
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
...
@@ -963,7 +1005,13 @@ help:
...
@@ -963,7 +1005,13 @@ help:
@
echo
' rpm - Build a kernel as an RPM package'
@
echo
' rpm - Build a kernel as an RPM package'
@
echo
' tags/TAGS - Generate tags file for editors'
@
echo
' tags/TAGS - Generate tags file for editors'
@
echo
' cscope - Generate cscope index'
@
echo
' cscope - Generate cscope index'
@
echo
''
@
echo
'Static analysers'
@
echo
' buildcheck - List dangling references to vmlinux discarded sections'
@
echo
' and init sections from non-init sections'
@
echo
' checkstack - Generate a list of stack hogs'
@
echo
' checkstack - Generate a list of stack hogs'
@
echo
' namespacecheck - Name space analysis on compiled kernel'
@
echo
''
@
echo
'Kernel packaging:'
@
echo
'Kernel packaging:'
@
$(MAKE)
-f
$
(
package-dir
)
/Makefile
help
@
$(MAKE)
-f
$
(
package-dir
)
/Makefile
help
@
echo
''
@
echo
''
...
@@ -1123,8 +1171,11 @@ versioncheck:
...
@@ -1123,8 +1171,11 @@ versioncheck:
| xargs
$(PERL)
-w
scripts/checkversion.pl
| xargs
$(PERL)
-w
scripts/checkversion.pl
buildcheck
:
buildcheck
:
$(PERL)
scripts/reference_discarded.pl
$(PERL)
$(srctree)
/scripts/reference_discarded.pl
$(PERL)
scripts/reference_init.pl
$(PERL)
$(srctree)
/scripts/reference_init.pl
namespacecheck
:
$(PERL)
$(srctree)
/scripts/namespace.pl
endif
#ifeq ($(config-targets),1)
endif
#ifeq ($(config-targets),1)
endif
#ifeq ($(mixed-targets),1)
endif
#ifeq ($(mixed-targets),1)
...
@@ -1161,13 +1212,22 @@ ifneq ($(cmd_files),)
...
@@ -1161,13 +1212,22 @@ ifneq ($(cmd_files),)
include
$(cmd_files)
include
$(cmd_files)
endif
endif
# Execute command and generate cmd file
if_changed
=
$(
if
$(
strip
$?
\
$(
filter-out
$
(
cmd_
$(1)
)
,
$
(
cmd_
$@
))
\
$(
filter-out
$
(
cmd_
$@
)
,
$
(
cmd_
$(1)
)))
,
\
@set
-e
;
\
$(
if
$
(
$(quiet)
cmd_
$(1)
)
,echo
'
$(
subst
'
,
'\'',$(
$(quiet)
cmd_
$(1)
))
'
;
)
\
$
(
cmd_
$(1)
)
;
\
echo
'cmd_$@ :=
$(
subst
$$,$$$$,
$(
subst
'
,
'\'',$(cmd_
$(1)
)))
'
>
$
(
@D
)
/.
$
(
@F
)
.cmd
)
# execute the command and also postprocess generated .d dependencies
# execute the command and also postprocess generated .d dependencies
# file
# file
if_changed_dep
=
$(
if
$(
strip
$?
$(
filter-out
FORCE
$(
wildcard
$^
)
,
$^
)
\
if_changed_dep
=
$(
if
$(
strip
$?
$(
filter-out
FORCE
$(
wildcard
$^
)
,
$^
)
\
$(
filter-out
$
(
cmd_
$(1)
)
,
$
(
cmd_
$@
))
\
$(
filter-out
$
(
cmd_
$(1)
)
,
$
(
cmd_
$@
))
\
$(
filter-out
$
(
cmd_
$@
)
,
$
(
cmd_
$(1)
)))
,
\
$(
filter-out
$
(
cmd_
$@
)
,
$
(
cmd_
$(1)
)))
,
\
@
set
-e
;
\
$(Q)
set
-e
;
\
$(
if
$
(
$(quiet)
cmd_
$(1)
)
,echo
'
$(
subst
'
,
'\'',$(
$(quiet)
cmd_
$(1)
))
'
;
)
\
$(
if
$
(
$(quiet)
cmd_
$(1)
)
,echo
'
$(
subst
'
,
'\'',$(
$(quiet)
cmd_
$(1)
))
'
;
)
\
$
(
cmd_
$(1)
)
;
\
$
(
cmd_
$(1)
)
;
\
scripts/basic/fixdep
$(depfile)
$@
'
$(
subst
$$,$$$$,
$(
subst
'
,
'\'',$(cmd_
$(1)
)))
'
>
$
(
@D
)
/.
$
(
@F
)
.tmp
;
\
scripts/basic/fixdep
$(depfile)
$@
'
$(
subst
$$,$$$$,
$(
subst
'
,
'\'',$(cmd_
$(1)
)))
'
>
$
(
@D
)
/.
$
(
@F
)
.tmp
;
\
...
@@ -1181,7 +1241,7 @@ if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^)\
...
@@ -1181,7 +1241,7 @@ if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^)\
if_changed_rule
=
$(
if
$(
strip
$?
\
if_changed_rule
=
$(
if
$(
strip
$?
\
$(
filter-out
$
(
cmd_
$(1)
)
,
$
(
cmd_
$
(
@F
)))
\
$(
filter-out
$
(
cmd_
$(1)
)
,
$
(
cmd_
$
(
@F
)))
\
$(
filter-out
$
(
cmd_
$
(
@F
))
,
$
(
cmd_
$(1)
)))
,
\
$(
filter-out
$
(
cmd_
$
(
@F
))
,
$
(
cmd_
$(1)
)))
,
\
@
$
(
rule_
$(1)
))
$(Q)
$
(
rule_
$(1)
))
# If quiet is set, only print short version of command
# If quiet is set, only print short version of command
...
...
arch/arm/Makefile
View file @
cce4ae63
...
@@ -8,7 +8,6 @@
...
@@ -8,7 +8,6 @@
# Copyright (C) 1995-2001 by Russell King
# Copyright (C) 1995-2001 by Russell King
LDFLAGS_vmlinux
:=
-p
--no-undefined
-X
LDFLAGS_vmlinux
:=
-p
--no-undefined
-X
LDFLAGS_BLOB
:=
--format
binary
CPPFLAGS_vmlinux.lds
=
-DTEXTADDR
=
$(TEXTADDR)
-DDATAADDR
=
$(DATAADDR)
CPPFLAGS_vmlinux.lds
=
-DTEXTADDR
=
$(TEXTADDR)
-DDATAADDR
=
$(DATAADDR)
OBJCOPYFLAGS
:=
-O
binary
-R
.note
-R
.comment
-S
OBJCOPYFLAGS
:=
-O
binary
-R
.note
-R
.comment
-S
GZFLAGS
:=
-9
GZFLAGS
:=
-9
...
...
arch/arm26/Makefile
View file @
cce4ae63
...
@@ -8,7 +8,6 @@
...
@@ -8,7 +8,6 @@
# Copyright (C) 1995-2001 by Russell King
# Copyright (C) 1995-2001 by Russell King
LDFLAGS_vmlinux
:=
-p
-X
LDFLAGS_vmlinux
:=
-p
-X
LDFLAGS_BLOB
:=
--format
binary
CPPFLAGS_vmlinux.lds
=
-DTEXTADDR
=
$(TEXTADDR)
-DDATAADDR
=
$(DATAADDR)
CPPFLAGS_vmlinux.lds
=
-DTEXTADDR
=
$(TEXTADDR)
-DDATAADDR
=
$(DATAADDR)
OBJCOPYFLAGS
:=
-O
binary
-R
.note
-R
.comment
-S
OBJCOPYFLAGS
:=
-O
binary
-R
.note
-R
.comment
-S
GZFLAGS
:=
-9
GZFLAGS
:=
-9
...
@@ -28,7 +27,6 @@ CFLAGS +=-mapcs-26 -mcpu=arm3 -mshort-load-bytes -msoft-float -Wa,-mno-fpu -Uar
...
@@ -28,7 +27,6 @@ CFLAGS +=-mapcs-26 -mcpu=arm3 -mshort-load-bytes -msoft-float -Wa,-mno-fpu -Uar
AFLAGS
+=
-mapcs-26
-mcpu
=
arm3
-mno-fpu
-msoft-float
-Wa
,-mno-fpu
AFLAGS
+=
-mapcs-26
-mcpu
=
arm3
-mno-fpu
-msoft-float
-Wa
,-mno-fpu
head-y
:=
arch
/arm26/machine/head.o
arch
/arm26/kernel/init_task.o
head-y
:=
arch
/arm26/machine/head.o
arch
/arm26/kernel/init_task.o
LDFLAGS_BLOB
+=
--oformat
elf32-littlearm
ifeq
($(CONFIG_XIP_KERNEL),y)
ifeq
($(CONFIG_XIP_KERNEL),y)
TEXTADDR
:=
0x03880000
TEXTADDR
:=
0x03880000
...
...
arch/arm26/boot/Makefile
View file @
cce4ae63
...
@@ -67,12 +67,12 @@ initrd:
...
@@ -67,12 +67,12 @@ initrd:
install
:
$(obj)/Image
install
:
$(obj)/Image
$(CONFIG_SHELL)
$(obj)
/install.sh
\
$(CONFIG_SHELL)
$(obj)
/install.sh
\
$(
VERSION)
.
$(PATCHLEVEL)
.
$(SUBLEVEL)$(EXTRAVERSION
)
\
$(
KERNELRELEASE
)
\
$(obj)
/Image System.map
"
$(INSTALL_PATH)
"
$(obj)
/Image System.map
"
$(INSTALL_PATH)
"
zinstall
:
$(obj)/zImage
zinstall
:
$(obj)/zImage
$(CONFIG_SHELL)
$(obj)
/install.sh
\
$(CONFIG_SHELL)
$(obj)
/install.sh
\
$(
VERSION)
.
$(PATCHLEVEL)
.
$(SUBLEVEL)$(EXTRAVERSION
)
\
$(
KERNELRELEASE
)
\
$(obj)
/zImage System.map
"
$(INSTALL_PATH)
"
$(obj)
/zImage System.map
"
$(INSTALL_PATH)
"
subdir-
:=
compressed
subdir-
:=
compressed
arch/cris/Makefile
View file @
cce4ae63
...
@@ -24,8 +24,6 @@ SARCH :=
...
@@ -24,8 +24,6 @@ SARCH :=
endif
endif
LD
=
$(CROSS_COMPILE)
ld
-mcrislinux
LD
=
$(CROSS_COMPILE)
ld
-mcrislinux
LDFLAGS_BLOB
:=
--format
binary
--oformat
elf32-cris
\
-T
arch
/cris/
$(SARCH)
/output_arch.ld
OBJCOPYFLAGS
:=
-O
binary
-R
.note
-R
.comment
-S
OBJCOPYFLAGS
:=
-O
binary
-R
.note
-R
.comment
-S
...
...
arch/ppc/Makefile
View file @
cce4ae63
...
@@ -131,4 +131,6 @@ endif
...
@@ -131,4 +131,6 @@ endif
@
true
@
true
CLEAN_FILES
+=
include/asm-
$(ARCH)
/offsets.h
\
CLEAN_FILES
+=
include/asm-
$(ARCH)
/offsets.h
\
arch
/
$(ARCH)
/kernel/asm-offsets.s
arch
/
$(ARCH)
/kernel/asm-offsets.s
\
$(TOUT)
arch/ppc/boot/utils/mkbugboot.c
View file @
cce4ae63
/*
/*
* arch/ppc/
pp3boot
/mkbugboot.c
* arch/ppc/
boot/utils
/mkbugboot.c
*
*
* Makes a Motorola PPCBUG ROM bootable image which can be flashed
* Makes a Motorola PPCBUG ROM bootable image which can be flashed
* into one of the FLASH banks on a Motorola PowerPlus board.
* into one of the FLASH banks on a Motorola PowerPlus board.
...
@@ -21,6 +21,11 @@
...
@@ -21,6 +21,11 @@
#include <stdlib.h>
#include <stdlib.h>
#include <errno.h>
#include <errno.h>
#include <fcntl.h>
#include <fcntl.h>
#ifdef __sun__
#include <inttypes.h>
#else
#include <stdint.h>
#endif
#ifdef __i386__
#ifdef __i386__
#define cpu_to_be32(x) le32_to_cpu(x)
#define cpu_to_be32(x) le32_to_cpu(x)
...
@@ -49,11 +54,6 @@ unsigned short le16_to_cpu(unsigned short x)
...
@@ -49,11 +54,6 @@ unsigned short le16_to_cpu(unsigned short x)
/* size of read buffer */
/* size of read buffer */
#define SIZE 0x1000
#define SIZE 0x1000
/* typedef long int32_t; */
typedef
unsigned
long
uint32_t
;
typedef
unsigned
short
uint16_t
;
typedef
unsigned
char
uint8_t
;
/* PPCBUG ROM boot header */
/* PPCBUG ROM boot header */
typedef
struct
bug_boot_header
{
typedef
struct
bug_boot_header
{
uint8_t
magic_word
[
4
];
/* "BOOT" */
uint8_t
magic_word
[
4
];
/* "BOOT" */
...
...
arch/ppc/boot/utils/mktree.c
View file @
cce4ae63
...
@@ -15,7 +15,11 @@
...
@@ -15,7 +15,11 @@
#include <sys/stat.h>
#include <sys/stat.h>
#include <unistd.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/in.h>
#ifdef __sun__
#include <inttypes.h>
#else
#include <stdint.h>
#include <stdint.h>
#endif
/* This gets tacked on the front of the image. There are also a few
/* This gets tacked on the front of the image. There are also a few
* bytes allocated after the _start label used by the boot rom (see
* bytes allocated after the _start label used by the boot rom (see
...
...
arch/um/Makefile-i386
View file @
cce4ae63
...
@@ -9,7 +9,6 @@ ELF_ARCH = $(SUBARCH)
...
@@ -9,7 +9,6 @@ ELF_ARCH = $(SUBARCH)
ELF_FORMAT = elf32-$(SUBARCH)
ELF_FORMAT = elf32-$(SUBARCH)
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
LDFLAGS_BLOB := --format binary --oformat elf32-i386
SYS_DIR := $(ARCH_DIR)/include/sysdep-i386
SYS_DIR := $(ARCH_DIR)/include/sysdep-i386
SYS_UTIL_DIR := $(ARCH_DIR)/sys-i386/util
SYS_UTIL_DIR := $(ARCH_DIR)/sys-i386/util
...
...
init/Kconfig
View file @
cce4ae63
...
@@ -54,6 +54,16 @@ endmenu
...
@@ -54,6 +54,16 @@ endmenu
menu "General setup"
menu "General setup"
config LOCALVERSION
string "Local version - append to kernel release"
help
Append an extra string to the end of your kernel version.
This will show up when you type uname, for example.
The string you set here will be appended after the contents of
any files with a filename matching localversion* in your
object and source tree, in that order. Your total string can
be a maximum of 64 characters.
config SWAP
config SWAP
bool "Support for paging of anonymous memory (swap)"
bool "Support for paging of anonymous memory (swap)"
depends on MMU
depends on MMU
...
...
scripts/Makefile.build
View file @
cce4ae63
...
@@ -160,9 +160,7 @@ else
...
@@ -160,9 +160,7 @@ else
cmd_cc_o_c
=
$(CC)
$(c_flags)
-c
-o
$
(
@D
)
/.tmp_
$
(
@F
)
$<
cmd_cc_o_c
=
$(CC)
$(c_flags)
-c
-o
$
(
@D
)
/.tmp_
$
(
@F
)
$<
cmd_modversions
=
\
cmd_modversions
=
\
if
!
$(OBJDUMP)
-h
$
(
@D
)
/.tmp_
$
(
@F
)
|
grep
-q
__ksymtab
;
then
\
if
$(OBJDUMP)
-h
$
(
@D
)
/.tmp_
$
(
@F
)
|
grep
-q
__ksymtab
;
then
\
mv
$
(
@D
)
/.tmp_
$
(
@F
)
$@
;
\
else
\
$(CPP)
-D__GENKSYMS__
$(c_flags)
$<
\
$(CPP)
-D__GENKSYMS__
$(c_flags)
$<
\
|
$(GENKSYMS)
\
|
$(GENKSYMS)
\
>
$
(
@D
)
/.tmp_
$
(
@F:.o
=
.ver
)
;
\
>
$
(
@D
)
/.tmp_
$
(
@F:.o
=
.ver
)
;
\
...
@@ -170,6 +168,8 @@ cmd_modversions = \
...
@@ -170,6 +168,8 @@ cmd_modversions = \
$(LD)
$(LDFLAGS)
-r
-o
$@
$
(
@D
)
/.tmp_
$
(
@F
)
\
$(LD)
$(LDFLAGS)
-r
-o
$@
$
(
@D
)
/.tmp_
$
(
@F
)
\
-T
$
(
@D
)
/.tmp_
$
(
@F:.o
=
.ver
)
;
\
-T
$
(
@D
)
/.tmp_
$
(
@F:.o
=
.ver
)
;
\
rm
-f
$
(
@D
)
/.tmp_
$
(
@F
)
$
(
@D
)
/.tmp_
$
(
@F:.o
=
.ver
)
;
\
rm
-f
$
(
@D
)
/.tmp_
$
(
@F
)
$
(
@D
)
/.tmp_
$
(
@F:.o
=
.ver
)
;
\
else
\
mv
$
(
@D
)
/.tmp_
$
(
@F
)
$@
;
\
fi
;
fi
;
endif
endif
...
...
scripts/Makefile.modinst
View file @
cce4ae63
...
@@ -9,7 +9,7 @@ include scripts/Makefile.lib
...
@@ -9,7 +9,7 @@ include scripts/Makefile.lib
#
#
__modules
:=
$(
sort
$(
shell
head
-q
-n1
/dev/null
$(
wildcard
$(MODVERDIR)
/
*
.mod
)))
__modules
:=
$(
sort
$(
shell
grep
-h
'\.ko'
/dev/null
$(
wildcard
$(MODVERDIR)
/
*
.mod
)))
modules
:=
$(
patsubst
%.o,%.ko,
$(
wildcard
$(__modules:.ko=.o)
))
modules
:=
$(
patsubst
%.o,%.ko,
$(
wildcard
$(__modules:.ko=.o)
))
.PHONY
:
$(modules)
.PHONY
:
$(modules)
...
...
scripts/Makefile.modpost
View file @
cce4ae63
...
@@ -41,7 +41,7 @@ include scripts/Makefile.lib
...
@@ -41,7 +41,7 @@ include scripts/Makefile.lib
symverfile
:=
$(objtree)
/Module.symvers
symverfile
:=
$(objtree)
/Module.symvers
# Step 1), find all modules listed in $(MODVERDIR)/
# Step 1), find all modules listed in $(MODVERDIR)/
__modules
:=
$(
sort
$(
shell
head
-q
-n1
/dev/null
$(
wildcard
$(MODVERDIR)
/
*
.mod
)))
__modules
:=
$(
sort
$(
shell
grep
-h
'\.ko'
/dev/null
$(
wildcard
$(MODVERDIR)
/
*
.mod
)))
modules
:=
$(
patsubst
%.o,%.ko,
$(
wildcard
$(__modules:.ko=.o)
))
modules
:=
$(
patsubst
%.o,%.ko,
$(
wildcard
$(__modules:.ko=.o)
))
_modpost
:
$(modules)
_modpost
:
$(modules)
...
...
scripts/genksyms/genksyms.c
View file @
cce4ae63
...
@@ -27,7 +27,9 @@
...
@@ -27,7 +27,9 @@
#include <unistd.h>
#include <unistd.h>
#include <assert.h>
#include <assert.h>
#include <stdarg.h>
#include <stdarg.h>
#ifdef __GNU_LIBRARY__
#include <getopt.h>
#include <getopt.h>
#endif
/* __GNU_LIBRARY__ */
#include "genksyms.h"
#include "genksyms.h"
...
@@ -502,12 +504,21 @@ void genksyms_usage(void)
...
@@ -502,12 +504,21 @@ void genksyms_usage(void)
fputs
(
"Usage:
\n
"
fputs
(
"Usage:
\n
"
"genksyms [-dDwqhV] > /path/to/.tmp_obj.ver
\n
"
"genksyms [-dDwqhV] > /path/to/.tmp_obj.ver
\n
"
"
\n
"
"
\n
"
#ifdef __GNU_LIBRARY__
" -d, --debug Increment the debug level (repeatable)
\n
"
" -d, --debug Increment the debug level (repeatable)
\n
"
" -D, --dump Dump expanded symbol defs (for debugging only)
\n
"
" -D, --dump Dump expanded symbol defs (for debugging only)
\n
"
" -w, --warnings Enable warnings
\n
"
" -w, --warnings Enable warnings
\n
"
" -q, --quiet Disable warnings (default)
\n
"
" -q, --quiet Disable warnings (default)
\n
"
" -h, --help Print this message
\n
"
" -h, --help Print this message
\n
"
" -V, --version Print the release version
\n
"
" -V, --version Print the release version
\n
"
#else
/* __GNU_LIBRARY__ */
" -d Increment the debug level (repeatable)
\n
"
" -D Dump expanded symbol defs (for debugging only)
\n
"
" -w Enable warnings
\n
"
" -q Disable warnings (default)
\n
"
" -h Print this message
\n
"
" -V Print the release version
\n
"
#endif
/* __GNU_LIBRARY__ */
,
stderr
);
,
stderr
);
}
}
...
@@ -516,6 +527,7 @@ main(int argc, char **argv)
...
@@ -516,6 +527,7 @@ main(int argc, char **argv)
{
{
int
o
;
int
o
;
#ifdef __GNU_LIBRARY__
struct
option
long_opts
[]
=
{
struct
option
long_opts
[]
=
{
{
"debug"
,
0
,
0
,
'd'
},
{
"debug"
,
0
,
0
,
'd'
},
{
"warnings"
,
0
,
0
,
'w'
},
{
"warnings"
,
0
,
0
,
'w'
},
...
@@ -528,6 +540,9 @@ main(int argc, char **argv)
...
@@ -528,6 +540,9 @@ main(int argc, char **argv)
while
((
o
=
getopt_long
(
argc
,
argv
,
"dwqVDk:p:"
,
while
((
o
=
getopt_long
(
argc
,
argv
,
"dwqVDk:p:"
,
&
long_opts
[
0
],
NULL
))
!=
EOF
)
&
long_opts
[
0
],
NULL
))
!=
EOF
)
#else
/* __GNU_LIBRARY__ */
while
((
o
=
getopt
(
argc
,
argv
,
"dwqVDk:p:"
))
!=
EOF
)
#endif
/* __GNU_LIBRARY__ */
switch
(
o
)
switch
(
o
)
{
{
case
'd'
:
case
'd'
:
...
...
scripts/kconfig/gconf.c
View file @
cce4ae63
...
@@ -275,9 +275,8 @@ void init_main_window(const gchar * glade_file)
...
@@ -275,9 +275,8 @@ void init_main_window(const gchar * glade_file)
/*"style", PANGO_STYLE_OBLIQUE, */
/*"style", PANGO_STYLE_OBLIQUE, */
NULL
);
NULL
);
sprintf
(
title
,
"Linux Kernel v%s.%s.%s%s Configuration"
,
sprintf
(
title
,
"Linux Kernel v%s Configuration"
,
getenv
(
"VERSION"
),
getenv
(
"PATCHLEVEL"
),
getenv
(
"KERNELRELEASE"
));
getenv
(
"SUBLEVEL"
),
getenv
(
"EXTRAVERSION"
));
gtk_window_set_title
(
GTK_WINDOW
(
main_wnd
),
title
);
gtk_window_set_title
(
GTK_WINDOW
(
main_wnd
),
title
);
gtk_widget_show
(
main_wnd
);
gtk_widget_show
(
main_wnd
);
...
...
scripts/mod/sumversion.c
View file @
cce4ae63
#include <netinet/in.h>
#include <netinet/in.h>
#ifdef __sun__
#include <inttypes.h>
#else
#include <stdint.h>
#include <stdint.h>
#endif
#include <ctype.h>
#include <ctype.h>
#include <errno.h>
#include <errno.h>
#include <string.h>
#include <string.h>
...
...
scripts/namespace.pl
0 → 100644
View file @
cce4ae63
#!/usr/bin/perl -w
#
# namespace.pl. Mon Aug 30 2004
#
# Perform a name space analysis on the linux kernel.
#
# Copyright Keith Owens <kaos@ocs.com.au>. GPL.
#
# Invoke by changing directory to the top of the kernel object
# tree then namespace.pl, no parameters.
#
# Tuned for 2.1.x kernels with the new module handling, it will
# work with 2.0 kernels as well.
#
# Last change 2.6.9-rc1, adding support for separate source and object
# trees.
#
# The source must be compiled/assembled first, the object files
# are the primary input to this script. Incomplete or missing
# objects will result in a flawed analysis. Compile both vmlinux
# and modules.
#
# Even with complete objects, treat the result of the analysis
# with caution. Some external references are only used by
# certain architectures, others with certain combinations of
# configuration parameters. Ideally the source should include
# something like
#
# #ifndef CONFIG_...
# static
# #endif
# symbol_definition;
#
# so the symbols are defined as static unless a particular
# CONFIG_... requires it to be external.
#
# A symbol that is suffixed with '(export only)' has these properties
#
# * It is global.
# * It is marked EXPORT_SYMBOL or EXPORT_SYMBOL_GPL, either in the same
# source file or a different source file.
# * Given the current .config, nothing uses the symbol.
#
# The symbol is a candidate for conversion to static, plus removal of the
# export. But be careful that a different .config might use the symbol.
#
#
# Name space analysis and cleanup is an iterative process. You cannot
# expect to find all the problems in a single pass.
#
# * Identify possibly unnecessary global declarations, verify that they
# really are unnecessary and change them to static.
# * Compile and fix up gcc warnings about static, removing dead symbols
# as necessary.
# * make clean and rebuild with different configs (especially
# CONFIG_MODULES=n) to see which symbols are being defined when the
# config does not require them. These symbols bloat the kernel object
# for no good reason, which is frustrating for embedded systems.
# * Wrap config sensitive symbols in #ifdef CONFIG_foo, as long as the
# code does not get too ugly.
# * Repeat the name space analysis until you can live with with the
# result.
#
require
5
;
# at least perl 5
use
strict
;
use
File::
Find
;
my
$nm
=
"
/usr/bin/nm -p
";
my
$objdump
=
"
/usr/bin/objdump -s -j .comment
";
my
$srctree
=
"";
my
$objtree
=
"";
$srctree
=
"
$ENV
{'srctree'}/
"
if
(
exists
(
$ENV
{'
srctree
'}));
$objtree
=
"
$ENV
{'objtree'}/
"
if
(
exists
(
$ENV
{'
objtree
'}));
if
(
$#ARGV
!=
-
1
)
{
print
STDERR
"
usage: $0 takes no parameters
\n
";
die
("
giving up
\n
");
}
my
%
nmdata
=
();
# nm data for each object
my
%
def
=
();
# all definitions for each name
my
%
ksymtab
=
();
# names that appear in __ksymtab_
my
%
ref
=
();
# $ref{$name} exists if there is a true external reference to $name
my
%
export
=
();
# $export{$name} exists if there is an EXPORT_... of $name
&
find
(
\&
linux_objects
,
'
.
');
# find the objects and do_nm on them
&
list_multiply_defined
();
&
resolve_external_references
();
&
list_extra_externals
();
exit
(
0
);
sub
linux_objects
{
# Select objects, ignoring objects which are only created by
# merging other objects. Also ignore all of modules, scripts
# and compressed. Most conglomerate objects are handled by do_nm,
# this list only contains the special cases. These include objects
# that are linked from just one other object and objects for which
# there is really no permanent source file.
my
$basename
=
$_
;
$_
=
$
File::Find::
name
;
s:^\./::
;
if
(
/.*\.o$/
&&
!
(
m:/built-in.o$:
||
m:arch/i386/kernel/vsyscall-syms.o$:
||
m:arch/ia64/ia32/ia32.o$:
||
m:arch/ia64/kernel/gate-syms.o$:
||
m:arch/ia64/lib/__divdi3.o$:
||
m:arch/ia64/lib/__divsi3.o$:
||
m:arch/ia64/lib/__moddi3.o$:
||
m:arch/ia64/lib/__modsi3.o$:
||
m:arch/ia64/lib/__udivdi3.o$:
||
m:arch/ia64/lib/__udivsi3.o$:
||
m:arch/ia64/lib/__umoddi3.o$:
||
m:arch/ia64/lib/__umodsi3.o$:
||
m:arch/ia64/scripts/check_gas_for_hint.o$:
||
m:arch/ia64/sn/kernel/xp.o$:
||
m:boot/bbootsect.o$:
||
m:boot/bsetup.o$:
||
m:/bootsect.o$:
||
m:/boot/setup.o$:
||
m:/compressed/:
||
m:drivers/cdrom/driver.o$:
||
m:drivers/char/drm/tdfx_drv.o$:
||
m:drivers/ide/ide-detect.o$:
||
m:drivers/ide/pci/idedriver-pci.o$:
||
m:drivers/media/media.o$:
||
m:drivers/scsi/sd_mod.o$:
||
m:drivers/video/video.o$:
||
m:fs/devpts/devpts.o$:
||
m:fs/exportfs/exportfs.o$:
||
m:fs/hugetlbfs/hugetlbfs.o$:
||
m:fs/msdos/msdos.o$:
||
m:fs/nls/nls.o$:
||
m:fs/ramfs/ramfs.o$:
||
m:fs/romfs/romfs.o$:
||
m:fs/vfat/vfat.o$:
||
m:init/mounts.o$:
||
m:^modules/:
||
m:net/netlink/netlink.o$:
||
m:net/sched/sched.o$:
||
m:/piggy.o$:
||
m:^scripts/:
||
m:sound/.*/snd-:
||
m:^.*/\.tmp_:
||
m:^\.tmp_:
||
m:/vmlinux-obj.o$:
)
)
{
do_nm
(
$basename
,
$_
);
}
$_
=
$basename
;
# File::Find expects $_ untouched (undocumented)
}
sub
do_nm
{
my
(
$basename
,
$fullname
)
=
@_
;
my
(
$source
,
$type
,
$name
);
if
(
!
-
e
$basename
)
{
printf
STDERR
"
$basename
does not exist
\n
";
return
;
}
if
(
$fullname
!~
/\.o$/
)
{
printf
STDERR
"
$fullname
is not an object file
\n
";
return
;
}
(
$source
=
$fullname
)
=~
s/\.o$//
;
if
(
-
e
"
$objtree$source
.c
"
||
-
e
"
$objtree$source
.S
")
{
$source
=
"
$objtree$source
";
}
else
{
$source
=
"
$srctree$source
";
}
if
(
!
-
e
"
$source
.c
"
&&
!
-
e
"
$source
.S
")
{
# No obvious source, exclude the object if it is conglomerate
if
(
!
open
(
OBJDUMPDATA
,
"
$objdump
$basename
|
"))
{
printf
STDERR
"
$objdump
$fullname
failed $!
\n
";
return
;
}
my
$comment
;
while
(
<
OBJDUMPDATA
>
)
{
chomp
();
if
(
/^In archive/
)
{
# Archives are always conglomerate
$comment
=
"
GCC:GCC:
";
last
;
}
next
if
(
!
/^[ 0-9a-f]{5,} /
);
$comment
.=
substr
(
$_
,
43
);
}
close
(
OBJDUMPDATA
);
if
(
!
defined
(
$comment
)
||
$comment
!~
/GCC\:.*GCC\:/m
)
{
printf
STDERR
"
No source file found for
$fullname
\n
";
}
return
;
}
if
(
!
open
(
NMDATA
,
"
$nm
$basename
|
"))
{
printf
STDERR
"
$nm
$fullname
failed $!
\n
";
return
;
}
my
@nmdata
;
while
(
<
NMDATA
>
)
{
chop
;
(
$type
,
$name
)
=
(
split
(
/ +/
,
$_
,
3
))[
1
..
2
];
# Expected types
# A absolute symbol
# B weak external reference to data that has been resolved
# C global variable, uninitialised
# D global variable, initialised
# G global variable, initialised, small data section
# R global array, initialised
# S global variable, uninitialised, small bss
# T global label/procedure
# U external reference
# W weak external reference to text that has been resolved
# a assembler equate
# b static variable, uninitialised
# d static variable, initialised
# g static variable, initialised, small data section
# r static array, initialised
# s static variable, uninitialised, small bss
# t static label/procedures
# w weak external reference to text that has not been resolved
# ? undefined type, used a lot by modules
if
(
$type
!~
/^[ABCDGRSTUWabdgrstw?]$/
)
{
printf
STDERR
"
nm output for
$fullname
contains unknown type '
$_
'
\n
";
}
elsif
(
$name
=~
/\./
)
{
# name with '.' is local static
}
else
{
$type
=
'
R
'
if
(
$type
eq
'
?
');
# binutils replaced ? with R at one point
# binutils keeps changing the type for exported symbols, force it to R
$type
=
'
R
'
if
(
$name
=~
/^__ksymtab/
||
$name
=~
/^__kstrtab/
);
$name
=~
s/_R[a-f0-9]{8}$//
;
# module versions adds this
if
(
$type
=~
/[ABCDGRSTW]/
&&
$name
ne
'
init_module
'
&&
$name
ne
'
cleanup_module
'
&&
$name
ne
'
Using_Versions
'
&&
$name
!~
/^Version_[0-9]+$/
&&
$name
!~
/^__parm_/
&&
$name
!~
/^__kstrtab/
&&
$name
!~
/^__ksymtab/
&&
$name
!~
/^__kcrctab_/
&&
$name
!~
/^__exitcall_/
&&
$name
!~
/^__initcall_/
&&
$name
!~
/^__kdb_initcall_/
&&
$name
!~
/^__kdb_exitcall_/
&&
$name
!~
/^__module_/
&&
$name
!~
/^__mod_/
&&
$name
!~
/^__crc_/
&&
$name
ne
'
__this_module
'
&&
$name
ne
'
kernel_version
')
{
if
(
!
exists
(
$def
{
$name
}))
{
$def
{
$name
}
=
[]
;
}
push
(
@
{
$def
{
$name
}},
$fullname
);
}
push
(
@nmdata
,
"
$type
$name
");
if
(
$name
=~
/^__ksymtab_/
)
{
$name
=
substr
(
$name
,
10
);
if
(
!
exists
(
$ksymtab
{
$name
}))
{
$ksymtab
{
$name
}
=
[]
;
}
push
(
@
{
$ksymtab
{
$name
}},
$fullname
);
}
}
}
close
(
NMDATA
);
if
(
$#nmdata
<
0
)
{
if
(
$fullname
ne
"
lib/brlock.o
"
&&
$fullname
ne
"
lib/dec_and_lock.o
"
&&
$fullname
ne
"
fs/xfs/xfs_macros.o
"
&&
$fullname
ne
"
drivers/ide/ide-probe-mini.o
"
&&
$fullname
ne
"
usr/initramfs_data.o
"
&&
$fullname
ne
"
drivers/acpi/executer/exdump.o
"
&&
$fullname
ne
"
drivers/acpi/resources/rsdump.o
"
&&
$fullname
ne
"
drivers/acpi/namespace/nsdumpdv.o
"
&&
$fullname
ne
"
drivers/acpi/namespace/nsdump.o
"
&&
$fullname
ne
"
arch/ia64/sn/kernel/sn2/io.o
"
&&
$fullname
ne
"
arch/ia64/kernel/gate-data.o
"
&&
$fullname
ne
"
drivers/ieee1394/oui.o
"
&&
$fullname
ne
"
security/capability.o
"
&&
$fullname
ne
"
sound/core/wrappers.o
"
&&
$fullname
ne
"
fs/ntfs/sysctl.o
"
&&
$fullname
ne
"
fs/jfs/jfs_debug.o
"
)
{
printf
"
No nm data for
$fullname
\n
";
}
return
;
}
$nmdata
{
$fullname
}
=
\
@nmdata
;
}
sub
drop_def
{
my
(
$object
,
$name
)
=
@_
;
my
$nmdata
=
$nmdata
{
$object
};
my
(
$i
,
$j
);
for
(
$i
=
0
;
$i
<=
$#
{
$nmdata
};
++
$i
)
{
if
(
$name
eq
(
split
('
',
$nmdata
->
[
$i
],
2
))[
1
])
{
splice
(
@
{
$nmdata
{
$object
}},
$i
,
1
);
my
$def
=
$def
{
$name
};
for
(
$j
=
0
;
$j
<
$#
{
$def
{
$name
}};
++
$j
)
{
if
(
$def
{
$name
}[
$j
]
eq
$object
)
{
splice
(
@
{
$def
{
$name
}},
$j
,
1
);
}
}
last
;
}
}
}
sub
list_multiply_defined
{
my
(
$name
,
$module
);
foreach
$name
(
keys
(
%
def
))
{
if
(
$#
{
$def
{
$name
}}
>
0
)
{
# Special case for cond_syscall
if
(
$#
{
$def
{
$name
}}
==
1
&&
$name
=~
/^sys_/
&&
(
$def
{
$name
}[
0
]
eq
"
kernel/sys.o
"
||
$def
{
$name
}[
1
]
eq
"
kernel/sys.o
"))
{
&
drop_def
("
kernel/sys.o
",
$name
);
next
;
}
# Special case for i386 entry code
if
(
$#
{
$def
{
$name
}}
==
1
&&
$name
=~
/^__kernel_/
&&
$def
{
$name
}[
0
]
eq
"
arch/i386/kernel/vsyscall-int80.o
"
&&
$def
{
$name
}[
1
]
eq
"
arch/i386/kernel/vsyscall-sysenter.o
")
{
&
drop_def
("
arch/i386/kernel/vsyscall-sysenter.o
",
$name
);
next
;
}
printf
"
$name
is multiply defined in :-
\n
";
foreach
$module
(
@
{
$def
{
$name
}})
{
printf
"
\t
$module
\n
";
}
}
}
}
sub
resolve_external_references
{
my
(
$object
,
$type
,
$name
,
$i
,
$j
,
$kstrtab
,
$ksymtab
,
$export
);
printf
"
\n
";
foreach
$object
(
keys
(
%
nmdata
))
{
my
$nmdata
=
$nmdata
{
$object
};
for
(
$i
=
0
;
$i
<=
$#
{
$nmdata
};
++
$i
)
{
(
$type
,
$name
)
=
split
('
',
$nmdata
->
[
$i
],
2
);
if
(
$type
eq
"
U
"
||
$type
eq
"
w
")
{
if
(
exists
(
$def
{
$name
})
||
exists
(
$ksymtab
{
$name
}))
{
# add the owning object to the nmdata
$nmdata
->
[
$i
]
=
"
$type
$name
$object
";
# only count as a reference if it is not EXPORT_...
$kstrtab
=
"
R __kstrtab_
$name
";
$ksymtab
=
"
R __ksymtab_
$name
";
$export
=
0
;
for
(
$j
=
0
;
$j
<=
$#
{
$nmdata
};
++
$j
)
{
if
(
$nmdata
->
[
$j
]
eq
$kstrtab
||
$nmdata
->
[
$j
]
eq
$ksymtab
)
{
$export
=
1
;
last
;
}
}
if
(
$export
)
{
$export
{
$name
}
=
"";
}
else
{
$ref
{
$name
}
=
""
}
}
elsif
(
$name
ne
"
mod_use_count_
"
&&
$name
ne
"
__initramfs_end
"
&&
$name
ne
"
__initramfs_start
"
&&
$name
ne
"
_einittext
"
&&
$name
ne
"
_sinittext
"
&&
$name
ne
"
kallsyms_names
"
&&
$name
ne
"
kallsyms_num_syms
"
&&
$name
ne
"
kallsyms_addresses
"
&&
$name
ne
"
__this_module
"
&&
$name
ne
"
_etext
"
&&
$name
ne
"
_edata
"
&&
$name
ne
"
_end
"
&&
$name
ne
"
__bss_start
"
&&
$name
ne
"
_text
"
&&
$name
ne
"
_stext
"
&&
$name
ne
"
__gp
"
&&
$name
ne
"
ia64_unw_start
"
&&
$name
ne
"
ia64_unw_end
"
&&
$name
ne
"
__init_begin
"
&&
$name
ne
"
__init_end
"
&&
$name
ne
"
__bss_stop
"
&&
$name
ne
"
__nosave_begin
"
&&
$name
ne
"
__nosave_end
"
&&
$name
ne
"
pg0
"
&&
$name
ne
"
__module_text_address
"
&&
$name
!~
/^__sched_text_/
&&
$name
!~
/^__start_/
&&
$name
!~
/^__end_/
&&
$name
!~
/^__stop_/
&&
$name
!~
/^__scheduling_functions_.*_here/
&&
$name
!~
/^__.*initcall_/
&&
$name
!~
/^__.*per_cpu_start/
&&
$name
!~
/^__.*per_cpu_end/
&&
$name
!~
/^__alt_instructions/
&&
$name
!~
/^__setup_/
)
{
printf
"
Cannot resolve
";
printf
"
weak
"
if
(
$type
eq
"
w
");
printf
"
reference to
$name
from
$object
\n
";
}
}
}
}
}
sub
list_extra_externals
{
my
%
noref
=
();
my
(
$name
,
@module
,
$module
,
$export
);
foreach
$name
(
keys
(
%
def
))
{
if
(
!
exists
(
$ref
{
$name
}))
{
@module
=
@
{
$def
{
$name
}};
foreach
$module
(
@module
)
{
if
(
!
exists
(
$noref
{
$module
}))
{
$noref
{
$module
}
=
[]
;
}
push
(
@
{
$noref
{
$module
}},
$name
);
}
}
}
if
(
%
noref
)
{
printf
"
\n
Externally defined symbols with no external references
\n
";
foreach
$module
(
sort
(
keys
(
%
noref
)))
{
printf
"
$module
\n
";
foreach
(
sort
(
@
{
$noref
{
$module
}}))
{
if
(
exists
(
$export
{
$_
}))
{
$export
=
"
(export only)
";
}
else
{
$export
=
"";
}
printf
"
$_$export
\n
";
}
}
}
}
scripts/package/builddeb
View file @
cce4ae63
...
@@ -12,7 +12,7 @@
...
@@ -12,7 +12,7 @@
set
-e
set
-e
# Some variables and settings used throughout the script
# Some variables and settings used throughout the script
version
=
"
$VERSION
.
$PATCHLEVEL
.
$SUBLEVEL$EXTRAVERSION
"
version
=
$KERNELRELEASE
tmpdir
=
"
$objtree
/debian/tmp"
tmpdir
=
"
$objtree
/debian/tmp"
# Setup the directory structure
# Setup the directory structure
...
...
scripts/package/mkspec
View file @
cce4ae63
...
@@ -21,11 +21,12 @@ if [ "`grep CONFIG_DRM=y .config | cut -f2 -d\=`" = "y" ]; then
...
@@ -21,11 +21,12 @@ if [ "`grep CONFIG_DRM=y .config | cut -f2 -d\=`" = "y" ]; then
PROVIDES
=
kernel-drm
PROVIDES
=
kernel-drm
fi
fi
PROVIDES
=
"
$PROVIDES
kernel-
$VERSION
.
$PATCHLEVEL
.
$SUBLEVEL$EXTRAVERSION
"
PROVIDES
=
"
$PROVIDES
kernel-
$KERNELRELEASE
"
__KERNELRELEASE
=
`
echo
$KERNELRELEASE
|
sed
-e
"s/-//g"
`
echo
"Name: kernel"
echo
"Name: kernel"
echo
"Summary: The Linux Kernel"
echo
"Summary: The Linux Kernel"
echo
"Version:
"
$VERSION
.
$PATCHLEVEL
.
$SUBLEVEL$EXTRAVERSION
|
sed
-e
"s/-//g
"
echo
"Version:
$__KERNELRELEASE
"
# we need to determine the NEXT version number so that uname and
# we need to determine the NEXT version number so that uname and
# rpm -q will agree
# rpm -q will agree
echo
"Release:
`
.
$srctree
/scripts/mkversion
`
"
echo
"Release:
`
.
$srctree
/scripts/mkversion
`
"
...
@@ -35,8 +36,7 @@ echo "Vendor: The Linux Community"
...
@@ -35,8 +36,7 @@ echo "Vendor: The Linux Community"
echo
"URL: http://www.kernel.org"
echo
"URL: http://www.kernel.org"
if
!
$PREBUILT
;
then
if
!
$PREBUILT
;
then
echo
-n
"Source: kernel-
$VERSION
.
$PATCHLEVEL
.
$SUBLEVEL
"
echo
"Source: kernel-
$__KERNELRELEASE
.tar.gz"
echo
"
$EXTRAVERSION
.tar.gz"
|
sed
-e
"s/-//g"
fi
fi
echo
"BuildRoot: /var/tmp/%{name}-%{PACKAGE_VERSION}-root"
echo
"BuildRoot: /var/tmp/%{name}-%{PACKAGE_VERSION}-root"
...
@@ -57,19 +57,19 @@ fi
...
@@ -57,19 +57,19 @@ fi
echo
"%build"
echo
"%build"
if
!
$PREBUILT
;
then
if
!
$PREBUILT
;
then
echo
"make clean && make"
echo
"make clean && make
%{_smp_mflags}
"
echo
""
echo
""
fi
fi
echo
"%install"
echo
"%install"
echo
'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules'
echo
'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules'
echo
'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make modules_install'
echo
'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make
%{_smp_mflags}
modules_install'
echo
'cp $KBUILD_IMAGE $RPM_BUILD_ROOT'
"/boot/vmlinuz-
$
VERSION
.
$PATCHLEVEL
.
$SUBLEVEL$EXTRAVERSION
"
echo
'cp $KBUILD_IMAGE $RPM_BUILD_ROOT'
"/boot/vmlinuz-
$
KERNELRELEASE
"
echo
'cp System.map $RPM_BUILD_ROOT'
"/boot/System.map-
$
VERSION
.
$PATCHLEVEL
.
$SUBLEVEL$EXTRAVERSION
"
echo
'cp System.map $RPM_BUILD_ROOT'
"/boot/System.map-
$
KERNELRELEASE
"
echo
'cp .config $RPM_BUILD_ROOT'
"/boot/config-
$
VERSION
.
$PATCHLEVEL
.
$SUBLEVEL$EXTRAVERSION
"
echo
'cp .config $RPM_BUILD_ROOT'
"/boot/config-
$
KERNELRELEASE
"
echo
""
echo
""
echo
"%clean"
echo
"%clean"
echo
'#echo -rf $RPM_BUILD_ROOT'
echo
'#echo -rf $RPM_BUILD_ROOT'
...
@@ -77,6 +77,6 @@ echo ""
...
@@ -77,6 +77,6 @@ echo ""
echo
"%files"
echo
"%files"
echo
'%defattr (-, root, root)'
echo
'%defattr (-, root, root)'
echo
"%dir /lib/modules"
echo
"%dir /lib/modules"
echo
"/lib/modules/
$
VERSION
.
$PATCHLEVEL
.
$SUBLEVEL$EXTRAVERSION
"
echo
"/lib/modules/
$
KERNELRELEASE
"
echo
"/boot/*"
echo
"/boot/*"
echo
""
echo
""
scripts/ver_linux
View file @
cce4ae63
...
@@ -37,8 +37,11 @@ tune2fs 2>&1 | grep "^tune2fs" | sed 's/,//' | awk \
...
@@ -37,8 +37,11 @@ tune2fs 2>&1 | grep "^tune2fs" | sed 's/,//' | awk \
fsck.jfs
-V
2>&1 |
grep
version |
sed
's/,//'
|
awk
\
fsck.jfs
-V
2>&1 |
grep
version |
sed
's/,//'
|
awk
\
'NR==1 {print "jfsutils ", $3}'
'NR==1 {print "jfsutils ", $3}'
reiserfsck
-V
2>&1 |
grep
reiserfsprogs |
awk
\
reiserfsck
-V
2>&1 |
grep
reiserfsck |
awk
\
'NR==1{print "reiserfsprogs ", $NF}'
'NR==1{print "reiserfsprogs ", $2}'
fsck.reiser4
-V
2>&1 |
grep
fsck.reiser4 |
awk
\
'NR==1{print "reiser4progs ", $2}'
xfs_db
-V
2>&1 |
grep
version |
awk
\
xfs_db
-V
2>&1 |
grep
version |
awk
\
'NR==1{print "xfsprogs ", $3}'
'NR==1{print "xfsprogs ", $3}'
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment