diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-25 11:48:48 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-25 11:48:48 -0500 |
| commit | 2e1ca21d46aaef95101723fa402f39d3a95aba59 (patch) | |
| tree | cd95efefb9ccb6ab4ac0589d01c06cdfc22cc989 | |
| parent | 315ab19a6d12d6af7b6957090822f3057ab7e80f (diff) | |
| parent | eae0f536f640bb95f2ad437a57c40c7d5683d1ac (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/sam/kbuild
* master.kernel.org:/pub/scm/linux/kernel/git/sam/kbuild: (46 commits)
kbuild: remove obsoleted scripts/reference_* files
kbuild: fix make help & make *pkg
kconfig: fix time ordering of writes to .kconfig.d and include/linux/autoconf.h
Kconfig: remove the CONFIG_CC_ALIGN_* options
kbuild: add -fverbose-asm to i386 Makefile
kbuild: clean-up genksyms
kbuild: Lindent genksyms.c
kbuild: fix genksyms build error
kbuild: in makefile.txt note that Makefile is preferred name for kbuild files
kbuild: replace PHONY with FORCE
kbuild: Fix bug in crc symbol generating of kernel and modules
kbuild: change kbuild to not rely on incorrect GNU make behavior
kbuild: when warning symbols exported twice now tell user this is the problem
kbuild: fix make dir/file.xx when asm symlink is missing
kbuild: in the section mismatch check try harder to find symbols
kbuild: fix section mismatch check for unwind on IA64
kbuild: kill false positives from section mismatch warnings for powerpc
kbuild: kill trailing whitespace in modpost & friends
kbuild: small update of allnoconfig description
kbuild: make namespace.pl CROSS_COMPILE happy
...
Trivial conflict in arch/ppc/boot/Makefile manually fixed up
52 files changed, 1500 insertions, 1259 deletions
diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile index 2975291e296a..7d87dd73cbe4 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile | |||
| @@ -28,7 +28,7 @@ PS_METHOD = $(prefer-db2x) | |||
| 28 | 28 | ||
| 29 | ### | 29 | ### |
| 30 | # The targets that may be used. | 30 | # The targets that may be used. |
| 31 | .PHONY: xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs | 31 | PHONY += xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs |
| 32 | 32 | ||
| 33 | BOOKS := $(addprefix $(obj)/,$(DOCBOOKS)) | 33 | BOOKS := $(addprefix $(obj)/,$(DOCBOOKS)) |
| 34 | xmldocs: $(BOOKS) | 34 | xmldocs: $(BOOKS) |
| @@ -211,3 +211,9 @@ clean-dirs := $(patsubst %.xml,%,$(DOCBOOKS)) | |||
| 211 | 211 | ||
| 212 | #man put files in man subdir - traverse down | 212 | #man put files in man subdir - traverse down |
| 213 | subdir- := man/ | 213 | subdir- := man/ |
| 214 | |||
| 215 | |||
| 216 | # Declare the contents of the .PHONY variable as phony. We keep that | ||
| 217 | # information in a variable se we can use it in if_changed and friends. | ||
| 218 | |||
| 219 | .PHONY: $(PHONY) | ||
diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt index 443230b43e09..a9c00facdf40 100644 --- a/Documentation/kbuild/makefiles.txt +++ b/Documentation/kbuild/makefiles.txt | |||
| @@ -17,6 +17,7 @@ This document describes the Linux kernel Makefiles. | |||
| 17 | --- 3.8 Command line dependency | 17 | --- 3.8 Command line dependency |
| 18 | --- 3.9 Dependency tracking | 18 | --- 3.9 Dependency tracking |
| 19 | --- 3.10 Special Rules | 19 | --- 3.10 Special Rules |
| 20 | --- 3.11 $(CC) support functions | ||
| 20 | 21 | ||
| 21 | === 4 Host Program support | 22 | === 4 Host Program support |
| 22 | --- 4.1 Simple Host Program | 23 | --- 4.1 Simple Host Program |
| @@ -38,7 +39,6 @@ This document describes the Linux kernel Makefiles. | |||
| 38 | --- 6.6 Commands useful for building a boot image | 39 | --- 6.6 Commands useful for building a boot image |
| 39 | --- 6.7 Custom kbuild commands | 40 | --- 6.7 Custom kbuild commands |
| 40 | --- 6.8 Preprocessing linker scripts | 41 | --- 6.8 Preprocessing linker scripts |
| 41 | --- 6.9 $(CC) support functions | ||
| 42 | 42 | ||
| 43 | === 7 Kbuild Variables | 43 | === 7 Kbuild Variables |
| 44 | === 8 Makefile language | 44 | === 8 Makefile language |
| @@ -106,9 +106,9 @@ This document is aimed towards normal developers and arch developers. | |||
| 106 | Most Makefiles within the kernel are kbuild Makefiles that use the | 106 | Most Makefiles within the kernel are kbuild Makefiles that use the |
| 107 | kbuild infrastructure. This chapter introduce the syntax used in the | 107 | kbuild infrastructure. This chapter introduce the syntax used in the |
| 108 | kbuild makefiles. | 108 | kbuild makefiles. |
| 109 | The preferred name for the kbuild files is 'Kbuild' but 'Makefile' will | 109 | The preferred name for the kbuild files are 'Makefile' but 'Kbuild' can |
| 110 | continue to be supported. All new developmen is expected to use the | 110 | be used and if both a 'Makefile' and a 'Kbuild' file exists then the 'Kbuild' |
| 111 | Kbuild filename. | 111 | file will be used. |
| 112 | 112 | ||
| 113 | Section 3.1 "Goal definitions" is a quick intro, further chapters provide | 113 | Section 3.1 "Goal definitions" is a quick intro, further chapters provide |
| 114 | more details, with real examples. | 114 | more details, with real examples. |
| @@ -385,6 +385,102 @@ more details, with real examples. | |||
| 385 | to prerequisites are referenced with $(src) (because they are not | 385 | to prerequisites are referenced with $(src) (because they are not |
| 386 | generated files). | 386 | generated files). |
| 387 | 387 | ||
| 388 | --- 3.11 $(CC) support functions | ||
| 389 | |||
| 390 | The kernel may be build with several different versions of | ||
| 391 | $(CC), each supporting a unique set of features and options. | ||
| 392 | kbuild provide basic support to check for valid options for $(CC). | ||
| 393 | $(CC) is useally the gcc compiler, but other alternatives are | ||
| 394 | available. | ||
| 395 | |||
| 396 | as-option | ||
| 397 | as-option is used to check if $(CC) when used to compile | ||
| 398 | assembler (*.S) files supports the given option. An optional | ||
| 399 | second option may be specified if first option are not supported. | ||
| 400 | |||
| 401 | Example: | ||
| 402 | #arch/sh/Makefile | ||
| 403 | cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),) | ||
| 404 | |||
| 405 | In the above example cflags-y will be assinged the the option | ||
| 406 | -Wa$(comma)-isa=$(isa-y) if it is supported by $(CC). | ||
| 407 | The second argument is optional, and if supplied will be used | ||
| 408 | if first argument is not supported. | ||
| 409 | |||
| 410 | cc-option | ||
| 411 | cc-option is used to check if $(CC) support a given option, and not | ||
| 412 | supported to use an optional second option. | ||
| 413 | |||
| 414 | Example: | ||
| 415 | #arch/i386/Makefile | ||
| 416 | cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586) | ||
| 417 | |||
| 418 | In the above example cflags-y will be assigned the option | ||
| 419 | -march=pentium-mmx if supported by $(CC), otherwise -march-i586. | ||
| 420 | The second argument to cc-option is optional, and if omitted | ||
| 421 | cflags-y will be assigned no value if first option is not supported. | ||
| 422 | |||
| 423 | cc-option-yn | ||
| 424 | cc-option-yn is used to check if gcc supports a given option | ||
| 425 | and return 'y' if supported, otherwise 'n'. | ||
| 426 | |||
| 427 | Example: | ||
| 428 | #arch/ppc/Makefile | ||
| 429 | biarch := $(call cc-option-yn, -m32) | ||
| 430 | aflags-$(biarch) += -a32 | ||
| 431 | cflags-$(biarch) += -m32 | ||
| 432 | |||
| 433 | In the above example $(biarch) is set to y if $(CC) supports the -m32 | ||
| 434 | option. When $(biarch) equals to y the expanded variables $(aflags-y) | ||
| 435 | and $(cflags-y) will be assigned the values -a32 and -m32. | ||
| 436 | |||
| 437 | cc-option-align | ||
| 438 | gcc version >= 3.0 shifted type of options used to speify | ||
| 439 | alignment of functions, loops etc. $(cc-option-align) whrn used | ||
| 440 | as prefix to the align options will select the right prefix: | ||
| 441 | gcc < 3.00 | ||
| 442 | cc-option-align = -malign | ||
| 443 | gcc >= 3.00 | ||
| 444 | cc-option-align = -falign | ||
| 445 | |||
| 446 | Example: | ||
| 447 | CFLAGS += $(cc-option-align)-functions=4 | ||
| 448 | |||
| 449 | In the above example the option -falign-functions=4 is used for | ||
| 450 | gcc >= 3.00. For gcc < 3.00 -malign-functions=4 is used. | ||
| 451 | |||
| 452 | cc-version | ||
| 453 | cc-version return a numerical version of the $(CC) compiler version. | ||
| 454 | The format is <major><minor> where both are two digits. So for example | ||
| 455 | gcc 3.41 would return 0341. | ||
| 456 | cc-version is useful when a specific $(CC) version is faulty in one | ||
| 457 | area, for example the -mregparm=3 were broken in some gcc version | ||
| 458 | even though the option was accepted by gcc. | ||
| 459 | |||
| 460 | Example: | ||
| 461 | #arch/i386/Makefile | ||
| 462 | cflags-y += $(shell \ | ||
| 463 | if [ $(call cc-version) -ge 0300 ] ; then \ | ||
| 464 | echo "-mregparm=3"; fi ;) | ||
| 465 | |||
| 466 | In the above example -mregparm=3 is only used for gcc version greater | ||
| 467 | than or equal to gcc 3.0. | ||
| 468 | |||
| 469 | cc-ifversion | ||
| 470 | cc-ifversion test the version of $(CC) and equals last argument if | ||
| 471 | version expression is true. | ||
| 472 | |||
| 473 | Example: | ||
| 474 | #fs/reiserfs/Makefile | ||
| 475 | EXTRA_CFLAGS := $(call cc-ifversion, -lt, 0402, -O1) | ||
| 476 | |||
| 477 | In this example EXTRA_CFLAGS will be assigned the value -O1 if the | ||
| 478 | $(CC) version is less than 4.2. | ||
| 479 | cc-ifversion takes all the shell operators: | ||
| 480 | -eq, -ne, -lt, -le, -gt, and -ge | ||
| 481 | The third parameter may be a text as in this example, but it may also | ||
| 482 | be an expanded variable or a macro. | ||
| 483 | |||
| 388 | 484 | ||
| 389 | === 4 Host Program support | 485 | === 4 Host Program support |
| 390 | 486 | ||
| @@ -973,74 +1069,6 @@ When kbuild executes the following steps are followed (roughly): | |||
| 973 | architecture specific files. | 1069 | architecture specific files. |
| 974 | 1070 | ||
| 975 | 1071 | ||
| 976 | --- 6.9 $(CC) support functions | ||
| 977 | |||
| 978 | The kernel may be build with several different versions of | ||
| 979 | $(CC), each supporting a unique set of features and options. | ||
| 980 | kbuild provide basic support to check for valid options for $(CC). | ||
| 981 | $(CC) is useally the gcc compiler, but other alternatives are | ||
| 982 | available. | ||
| 983 | |||
| 984 | cc-option | ||
| 985 | cc-option is used to check if $(CC) support a given option, and not | ||
| 986 | supported to use an optional second option. | ||
| 987 | |||
| 988 | Example: | ||
| 989 | #arch/i386/Makefile | ||
| 990 | cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586) | ||
| 991 | |||
| 992 | In the above example cflags-y will be assigned the option | ||
| 993 | -march=pentium-mmx if supported by $(CC), otherwise -march-i586. | ||
| 994 | The second argument to cc-option is optional, and if omitted | ||
| 995 | cflags-y will be assigned no value if first option is not supported. | ||
| 996 | |||
| 997 | cc-option-yn | ||
| 998 | cc-option-yn is used to check if gcc supports a given option | ||
| 999 | and return 'y' if supported, otherwise 'n'. | ||
| 1000 | |||
| 1001 | Example: | ||
| 1002 | #arch/ppc/Makefile | ||
| 1003 | biarch := $(call cc-option-yn, -m32) | ||
| 1004 | aflags-$(biarch) += -a32 | ||
| 1005 | cflags-$(biarch) += -m32 | ||
| 1006 | |||
| 1007 | In the above example $(biarch) is set to y if $(CC) supports the -m32 | ||
| 1008 | option. When $(biarch) equals to y the expanded variables $(aflags-y) | ||
| 1009 | and $(cflags-y) will be assigned the values -a32 and -m32. | ||
| 1010 | |||
| 1011 | cc-option-align | ||
| 1012 | gcc version >= 3.0 shifted type of options used to speify | ||
| 1013 | alignment of functions, loops etc. $(cc-option-align) whrn used | ||
| 1014 | as prefix to the align options will select the right prefix: | ||
| 1015 | gcc < 3.00 | ||
| 1016 | cc-option-align = -malign | ||
| 1017 | gcc >= 3.00 | ||
| 1018 | cc-option-align = -falign | ||
| 1019 | |||
| 1020 | Example: | ||
| 1021 | CFLAGS += $(cc-option-align)-functions=4 | ||
| 1022 | |||
| 1023 | In the above example the option -falign-functions=4 is used for | ||
| 1024 | gcc >= 3.00. For gcc < 3.00 -malign-functions=4 is used. | ||
| 1025 | |||
| 1026 | cc-version | ||
| 1027 | cc-version return a numerical version of the $(CC) compiler version. | ||
| 1028 | The format is <major><minor> where both are two digits. So for example | ||
| 1029 | gcc 3.41 would return 0341. | ||
| 1030 | cc-version is useful when a specific $(CC) version is faulty in one | ||
| 1031 | area, for example the -mregparm=3 were broken in some gcc version | ||
| 1032 | even though the option was accepted by gcc. | ||
| 1033 | |||
| 1034 | Example: | ||
| 1035 | #arch/i386/Makefile | ||
| 1036 | cflags-y += $(shell \ | ||
| 1037 | if [ $(call cc-version) -ge 0300 ] ; then \ | ||
| 1038 | echo "-mregparm=3"; fi ;) | ||
| 1039 | |||
| 1040 | In the above example -mregparm=3 is only used for gcc version greater | ||
| 1041 | than or equal to gcc 3.0. | ||
| 1042 | |||
| 1043 | |||
| 1044 | === 7 Kbuild Variables | 1072 | === 7 Kbuild Variables |
| 1045 | 1073 | ||
| 1046 | The top Makefile exports the following variables: | 1074 | The top Makefile exports the following variables: |
diff --git a/Documentation/kbuild/modules.txt b/Documentation/kbuild/modules.txt index 7e77f93634ea..fcccf2432f98 100644 --- a/Documentation/kbuild/modules.txt +++ b/Documentation/kbuild/modules.txt | |||
| @@ -13,6 +13,7 @@ In this document you will find information about: | |||
| 13 | --- 2.2 Available targets | 13 | --- 2.2 Available targets |
| 14 | --- 2.3 Available options | 14 | --- 2.3 Available options |
| 15 | --- 2.4 Preparing the kernel tree for module build | 15 | --- 2.4 Preparing the kernel tree for module build |
| 16 | --- 2.5 Building separate files for a module | ||
| 16 | === 3. Example commands | 17 | === 3. Example commands |
| 17 | === 4. Creating a kbuild file for an external module | 18 | === 4. Creating a kbuild file for an external module |
| 18 | === 5. Include files | 19 | === 5. Include files |
| @@ -22,7 +23,10 @@ In this document you will find information about: | |||
| 22 | === 6. Module installation | 23 | === 6. Module installation |
| 23 | --- 6.1 INSTALL_MOD_PATH | 24 | --- 6.1 INSTALL_MOD_PATH |
| 24 | --- 6.2 INSTALL_MOD_DIR | 25 | --- 6.2 INSTALL_MOD_DIR |
| 25 | === 7. Module versioning | 26 | === 7. Module versioning & Module.symvers |
| 27 | --- 7.1 Symbols fron the kernel (vmlinux + modules) | ||
| 28 | --- 7.2 Symbols and external modules | ||
| 29 | --- 7.3 Symbols from another external module | ||
| 26 | === 8. Tips & Tricks | 30 | === 8. Tips & Tricks |
| 27 | --- 8.1 Testing for CONFIG_FOO_BAR | 31 | --- 8.1 Testing for CONFIG_FOO_BAR |
| 28 | 32 | ||
| @@ -88,7 +92,8 @@ when building an external module. | |||
| 88 | make -C $KDIR M=$PWD modules_install | 92 | make -C $KDIR M=$PWD modules_install |
| 89 | Install the external module(s). | 93 | Install the external module(s). |
| 90 | Installation default is in /lib/modules/<kernel-version>/extra, | 94 | Installation default is in /lib/modules/<kernel-version>/extra, |
| 91 | but may be prefixed with INSTALL_MOD_PATH - see separate chapter. | 95 | but may be prefixed with INSTALL_MOD_PATH - see separate |
| 96 | chapter. | ||
| 92 | 97 | ||
| 93 | make -C $KDIR M=$PWD clean | 98 | make -C $KDIR M=$PWD clean |
| 94 | Remove all generated files for the module - the kernel | 99 | Remove all generated files for the module - the kernel |
| @@ -131,6 +136,16 @@ when building an external module. | |||
| 131 | Therefore a full kernel build needs to be executed to make | 136 | Therefore a full kernel build needs to be executed to make |
| 132 | module versioning work. | 137 | module versioning work. |
| 133 | 138 | ||
| 139 | --- 2.5 Building separate files for a module | ||
| 140 | It is possible to build single files which is part of a module. | ||
| 141 | This works equal for the kernel, a module and even for external | ||
| 142 | modules. | ||
| 143 | Examples (module foo.ko, consist of bar.o, baz.o): | ||
| 144 | make -C $KDIR M=`pwd` bar.lst | ||
| 145 | make -C $KDIR M=`pwd` bar.o | ||
| 146 | make -C $KDIR M=`pwd` foo.ko | ||
| 147 | make -C $KDIR M=`pwd` / | ||
| 148 | |||
| 134 | 149 | ||
| 135 | === 3. Example commands | 150 | === 3. Example commands |
| 136 | 151 | ||
| @@ -422,7 +437,7 @@ External modules are installed in the directory: | |||
| 422 | => Install dir: /lib/modules/$(KERNELRELEASE)/gandalf | 437 | => Install dir: /lib/modules/$(KERNELRELEASE)/gandalf |
| 423 | 438 | ||
| 424 | 439 | ||
| 425 | === 7. Module versioning | 440 | === 7. Module versioning & Module.symvers |
| 426 | 441 | ||
| 427 | Module versioning is enabled by the CONFIG_MODVERSIONS tag. | 442 | Module versioning is enabled by the CONFIG_MODVERSIONS tag. |
| 428 | 443 | ||
| @@ -432,11 +447,80 @@ when a module is loaded/used then the CRC values contained in the kernel are | |||
| 432 | compared with similar values in the module. If they are not equal then the | 447 | compared with similar values in the module. If they are not equal then the |
| 433 | kernel refuses to load the module. | 448 | kernel refuses to load the module. |
| 434 | 449 | ||
| 435 | During a kernel build a file named Module.symvers will be generated. This | 450 | Module.symvers contains a list of all exported symbols from a kernel build. |
| 436 | file includes the symbol version of all symbols within the kernel. If the | 451 | |
| 437 | Module.symvers file is saved from the last full kernel compile one does not | 452 | --- 7.1 Symbols fron the kernel (vmlinux + modules) |
| 438 | have to do a full kernel compile to build a module version's compatible module. | 453 | |
| 454 | During a kernel build a file named Module.symvers will be generated. | ||
| 455 | Module.symvers contains all exported symbols from the kernel and | ||
| 456 | compiled modules. For each symbols the corresponding CRC value | ||
| 457 | is stored too. | ||
| 458 | |||
| 459 | The syntax of the Module.symvers file is: | ||
| 460 | <CRC> <Symbol> <module> | ||
| 461 | Sample: | ||
| 462 | 0x2d036834 scsi_remove_host drivers/scsi/scsi_mod | ||
| 439 | 463 | ||
| 464 | For a kernel build without CONFIG_MODVERSIONING enabled the crc | ||
| 465 | would read: 0x00000000 | ||
| 466 | |||
| 467 | Module.symvers serve two purposes. | ||
| 468 | 1) It list all exported symbols both from vmlinux and all modules | ||
| 469 | 2) It list CRC if CONFIG_MODVERSION is enabled | ||
| 470 | |||
| 471 | --- 7.2 Symbols and external modules | ||
| 472 | |||
| 473 | When building an external module the build system needs access to | ||
| 474 | the symbols from the kernel to check if all external symbols are | ||
| 475 | defined. This is done in the MODPOST step and to obtain all | ||
| 476 | symbols modpost reads Module.symvers from the kernel. | ||
| 477 | If a Module.symvers file is present in the directory where | ||
| 478 | the external module is being build this file will be read too. | ||
| 479 | During the MODPOST step a new Module.symvers file will be written | ||
| 480 | containing all exported symbols that was not defined in the kernel. | ||
| 481 | |||
| 482 | --- 7.3 Symbols from another external module | ||
| 483 | |||
| 484 | Sometimes one external module uses exported symbols from another | ||
| 485 | external module. Kbuild needs to have full knowledge on all symbols | ||
| 486 | to avoid spitting out warnings about undefined symbols. | ||
| 487 | Two solutions exist to let kbuild know all symbols of more than | ||
| 488 | one external module. | ||
| 489 | The method with a top-level kbuild file is recommended but may be | ||
| 490 | impractical in certain situations. | ||
| 491 | |||
| 492 | Use a top-level Kbuild file | ||
| 493 | If you have two modules: 'foo', 'bar' and 'foo' needs symbols | ||
| 494 | from 'bar' then one can use a common top-level kbuild file so | ||
| 495 | both modules are compiled in same build. | ||
| 496 | |||
| 497 | Consider following directory layout: | ||
| 498 | ./foo/ <= contains the foo module | ||
| 499 | ./bar/ <= contains the bar module | ||
| 500 | The top-level Kbuild file would then look like: | ||
| 501 | |||
| 502 | #./Kbuild: (this file may also be named Makefile) | ||
| 503 | obj-y := foo/ bar/ | ||
| 504 | |||
| 505 | Executing: | ||
| 506 | make -C $KDIR M=`pwd` | ||
| 507 | |||
| 508 | will then do the expected and compile both modules with full | ||
| 509 | knowledge on symbols from both modules. | ||
| 510 | |||
| 511 | Use an extra Module.symvers file | ||
| 512 | When an external module is build a Module.symvers file is | ||
| 513 | generated containing all exported symbols which are not | ||
| 514 | defined in the kernel. | ||
| 515 | To get access to symbols from module 'bar' one can copy the | ||
| 516 | Module.symvers file from the compilation of the 'bar' module | ||
| 517 | to the directory where the 'foo' module is build. | ||
| 518 | During the module build kbuild will read the Module.symvers | ||
| 519 | file in the directory of the external module and when the | ||
| 520 | build is finished a new Module.symvers file is created | ||
| 521 | containing the sum of all symbols defined and not part of the | ||
| 522 | kernel. | ||
| 523 | |||
| 440 | === 8. Tips & Tricks | 524 | === 8. Tips & Tricks |
| 441 | 525 | ||
| 442 | --- 8.1 Testing for CONFIG_FOO_BAR | 526 | --- 8.1 Testing for CONFIG_FOO_BAR |
diff --git a/Documentation/smart-config.txt b/Documentation/smart-config.txt index c9bed4cf8773..8467447b5a87 100644 --- a/Documentation/smart-config.txt +++ b/Documentation/smart-config.txt | |||
| @@ -56,10 +56,6 @@ Here is the solution: | |||
| 56 | writing one file per option. It updates only the files for options | 56 | writing one file per option. It updates only the files for options |
| 57 | that have changed. | 57 | that have changed. |
| 58 | 58 | ||
| 59 | mkdep.c no longer generates warning messages for missing or unneeded | ||
| 60 | <linux/config.h> lines. The new top-level target 'make checkconfig' | ||
| 61 | checks for these problems. | ||
| 62 | |||
| 63 | Flag Dependencies | 59 | Flag Dependencies |
| 64 | 60 | ||
| 65 | Martin Von Loewis contributed another feature to this patch: | 61 | Martin Von Loewis contributed another feature to this patch: |
| @@ -95,7 +95,7 @@ ifdef O | |||
| 95 | endif | 95 | endif |
| 96 | 96 | ||
| 97 | # That's our default target when none is given on the command line | 97 | # That's our default target when none is given on the command line |
| 98 | .PHONY: _all | 98 | PHONY := _all |
| 99 | _all: | 99 | _all: |
| 100 | 100 | ||
| 101 | ifneq ($(KBUILD_OUTPUT),) | 101 | ifneq ($(KBUILD_OUTPUT),) |
| @@ -106,7 +106,7 @@ KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd) | |||
| 106 | $(if $(KBUILD_OUTPUT),, \ | 106 | $(if $(KBUILD_OUTPUT),, \ |
| 107 | $(error output directory "$(saved-output)" does not exist)) | 107 | $(error output directory "$(saved-output)" does not exist)) |
| 108 | 108 | ||
| 109 | .PHONY: $(MAKECMDGOALS) | 109 | PHONY += $(MAKECMDGOALS) |
| 110 | 110 | ||
| 111 | $(filter-out _all,$(MAKECMDGOALS)) _all: | 111 | $(filter-out _all,$(MAKECMDGOALS)) _all: |
| 112 | $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \ | 112 | $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \ |
| @@ -123,7 +123,7 @@ ifeq ($(skip-makefile),) | |||
| 123 | 123 | ||
| 124 | # If building an external module we do not care about the all: rule | 124 | # If building an external module we do not care about the all: rule |
| 125 | # but instead _all depend on modules | 125 | # but instead _all depend on modules |
| 126 | .PHONY: all | 126 | PHONY += all |
| 127 | ifeq ($(KBUILD_EXTMOD),) | 127 | ifeq ($(KBUILD_EXTMOD),) |
| 128 | _all: all | 128 | _all: all |
| 129 | else | 129 | else |
| @@ -137,7 +137,7 @@ objtree := $(CURDIR) | |||
| 137 | src := $(srctree) | 137 | src := $(srctree) |
| 138 | obj := $(objtree) | 138 | obj := $(objtree) |
| 139 | 139 | ||
| 140 | VPATH := $(srctree) | 140 | VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD)) |
| 141 | 141 | ||
| 142 | export srctree objtree VPATH TOPDIR | 142 | export srctree objtree VPATH TOPDIR |
| 143 | 143 | ||
| @@ -151,7 +151,7 @@ export srctree objtree VPATH TOPDIR | |||
| 151 | SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ | 151 | SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ |
| 152 | -e s/arm.*/arm/ -e s/sa110/arm/ \ | 152 | -e s/arm.*/arm/ -e s/sa110/arm/ \ |
| 153 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ | 153 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ |
| 154 | -e s/ppc.*/powerpc/ ) | 154 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ ) |
| 155 | 155 | ||
| 156 | # Cross compiling and selecting different set of gcc/bin-utils | 156 | # Cross compiling and selecting different set of gcc/bin-utils |
| 157 | # --------------------------------------------------------------------------- | 157 | # --------------------------------------------------------------------------- |
| @@ -258,38 +258,6 @@ endif | |||
| 258 | 258 | ||
| 259 | export quiet Q KBUILD_VERBOSE | 259 | export quiet Q KBUILD_VERBOSE |
| 260 | 260 | ||
| 261 | ###### | ||
| 262 | # cc support functions to be used (only) in arch/$(ARCH)/Makefile | ||
| 263 | # See documentation in Documentation/kbuild/makefiles.txt | ||
| 264 | |||
| 265 | # as-option | ||
| 266 | # Usage: cflags-y += $(call as-option, -Wa$(comma)-isa=foo,) | ||
| 267 | |||
| 268 | as-option = $(shell if $(CC) $(CFLAGS) $(1) -Wa,-Z -c -o /dev/null \ | ||
| 269 | -xassembler /dev/null > /dev/null 2>&1; then echo "$(1)"; \ | ||
| 270 | else echo "$(2)"; fi ;) | ||
| 271 | |||
| 272 | # cc-option | ||
| 273 | # Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586) | ||
| 274 | |||
| 275 | cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ | ||
| 276 | > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) | ||
| 277 | |||
| 278 | # cc-option-yn | ||
| 279 | # Usage: flag := $(call cc-option-yn, -march=winchip-c6) | ||
| 280 | cc-option-yn = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ | ||
| 281 | > /dev/null 2>&1; then echo "y"; else echo "n"; fi;) | ||
| 282 | |||
| 283 | # cc-option-align | ||
| 284 | # Prefix align with either -falign or -malign | ||
| 285 | cc-option-align = $(subst -functions=0,,\ | ||
| 286 | $(call cc-option,-falign-functions=0,-malign-functions=0)) | ||
| 287 | |||
| 288 | # cc-version | ||
| 289 | # Usage gcc-ver := $(call cc-version $(CC)) | ||
| 290 | cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh \ | ||
| 291 | $(if $(1), $(1), $(CC))) | ||
| 292 | |||
| 293 | 261 | ||
| 294 | # Look for make include files relative to root of kernel src | 262 | # Look for make include files relative to root of kernel src |
| 295 | MAKEFLAGS += --include-dir=$(srctree) | 263 | MAKEFLAGS += --include-dir=$(srctree) |
| @@ -369,14 +337,14 @@ export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exc | |||
| 369 | # Rules shared between *config targets and build targets | 337 | # Rules shared between *config targets and build targets |
| 370 | 338 | ||
| 371 | # Basic helpers built in scripts/ | 339 | # Basic helpers built in scripts/ |
| 372 | .PHONY: scripts_basic | 340 | PHONY += scripts_basic |
| 373 | scripts_basic: | 341 | scripts_basic: |
| 374 | $(Q)$(MAKE) $(build)=scripts/basic | 342 | $(Q)$(MAKE) $(build)=scripts/basic |
| 375 | 343 | ||
| 376 | # To avoid any implicit rule to kick in, define an empty command. | 344 | # To avoid any implicit rule to kick in, define an empty command. |
| 377 | scripts/basic/%: scripts_basic ; | 345 | scripts/basic/%: scripts_basic ; |
| 378 | 346 | ||
| 379 | .PHONY: outputmakefile | 347 | PHONY += outputmakefile |
| 380 | # outputmakefile generate a Makefile to be placed in output directory, if | 348 | # outputmakefile generate a Makefile to be placed in output directory, if |
| 381 | # using a seperate output directory. This allows convinient use | 349 | # using a seperate output directory. This allows convinient use |
| 382 | # of make in output directory | 350 | # of make in output directory |
| @@ -452,7 +420,7 @@ ifeq ($(KBUILD_EXTMOD),) | |||
| 452 | # Additional helpers built in scripts/ | 420 | # Additional helpers built in scripts/ |
| 453 | # Carefully list dependencies so we do not try to build scripts twice | 421 | # Carefully list dependencies so we do not try to build scripts twice |
| 454 | # in parrallel | 422 | # in parrallel |
| 455 | .PHONY: scripts | 423 | PHONY += scripts |
| 456 | scripts: scripts_basic include/config/MARKER | 424 | scripts: scripts_basic include/config/MARKER |
| 457 | $(Q)$(MAKE) $(build)=$(@) | 425 | $(Q)$(MAKE) $(build)=$(@) |
| 458 | 426 | ||
| @@ -504,13 +472,6 @@ else | |||
| 504 | CFLAGS += -O2 | 472 | CFLAGS += -O2 |
| 505 | endif | 473 | endif |
| 506 | 474 | ||
| 507 | #Add align options if CONFIG_CC_* is not equal to 0 | ||
| 508 | add-align = $(if $(filter-out 0,$($(1))),$(cc-option-align)$(2)=$($(1))) | ||
| 509 | CFLAGS += $(call add-align,CONFIG_CC_ALIGN_FUNCTIONS,-functions) | ||
| 510 | CFLAGS += $(call add-align,CONFIG_CC_ALIGN_LABELS,-labels) | ||
| 511 | CFLAGS += $(call add-align,CONFIG_CC_ALIGN_LOOPS,-loops) | ||
| 512 | CFLAGS += $(call add-align,CONFIG_CC_ALIGN_JUMPS,-jumps) | ||
| 513 | |||
| 514 | ifdef CONFIG_FRAME_POINTER | 475 | ifdef CONFIG_FRAME_POINTER |
| 515 | CFLAGS += -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,) | 476 | CFLAGS += -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,) |
| 516 | else | 477 | else |
| @@ -756,7 +717,7 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; | |||
| 756 | # make menuconfig etc. | 717 | # make menuconfig etc. |
| 757 | # Error messages still appears in the original language | 718 | # Error messages still appears in the original language |
| 758 | 719 | ||
| 759 | .PHONY: $(vmlinux-dirs) | 720 | PHONY += $(vmlinux-dirs) |
| 760 | $(vmlinux-dirs): prepare scripts | 721 | $(vmlinux-dirs): prepare scripts |
| 761 | $(Q)$(MAKE) $(build)=$@ | 722 | $(Q)$(MAKE) $(build)=$@ |
| 762 | 723 | ||
| @@ -809,10 +770,10 @@ kernelrelease = $(KERNELVERSION)$(localver-full) | |||
| 809 | # version.h and scripts_basic is processed / created. | 770 | # version.h and scripts_basic is processed / created. |
| 810 | 771 | ||
| 811 | # Listed in dependency order | 772 | # Listed in dependency order |
| 812 | .PHONY: prepare archprepare prepare0 prepare1 prepare2 prepare3 | 773 | PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3 |
| 813 | 774 | ||
| 814 | # prepare-all is deprecated, use prepare as valid replacement | 775 | # prepare-all is deprecated, use prepare as valid replacement |
| 815 | .PHONY: prepare-all | 776 | PHONY += prepare-all |
| 816 | 777 | ||
| 817 | # prepare3 is used to check if we are building in a separate output directory, | 778 | # prepare3 is used to check if we are building in a separate output directory, |
| 818 | # and if so do: | 779 | # and if so do: |
| @@ -853,27 +814,6 @@ prepare prepare-all: prepare0 | |||
| 853 | 814 | ||
| 854 | export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH) | 815 | export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH) |
| 855 | 816 | ||
| 856 | # Single targets | ||
| 857 | # --------------------------------------------------------------------------- | ||
| 858 | |||
| 859 | %.s: %.c scripts FORCE | ||
| 860 | $(Q)$(MAKE) $(build)=$(@D) $@ | ||
| 861 | %.i: %.c scripts FORCE | ||
| 862 | $(Q)$(MAKE) $(build)=$(@D) $@ | ||
| 863 | %.o: %.c scripts FORCE | ||
| 864 | $(Q)$(MAKE) $(build)=$(@D) $@ | ||
| 865 | %.ko: scripts FORCE | ||
| 866 | $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D) $(@:.ko=.o) | ||
| 867 | $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost | ||
| 868 | %/: scripts prepare FORCE | ||
| 869 | $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D) | ||
| 870 | %.lst: %.c scripts FORCE | ||
| 871 | $(Q)$(MAKE) $(build)=$(@D) $@ | ||
| 872 | %.s: %.S scripts FORCE | ||
| 873 | $(Q)$(MAKE) $(build)=$(@D) $@ | ||
| 874 | %.o: %.S scripts FORCE | ||
| 875 | $(Q)$(MAKE) $(build)=$(@D) $@ | ||
| 876 | |||
| 877 | # FIXME: The asm symlink changes when $(ARCH) changes. That's | 817 | # FIXME: The asm symlink changes when $(ARCH) changes. That's |
| 878 | # hard to detect, but I suppose "make mrproper" is a good idea | 818 | # hard to detect, but I suppose "make mrproper" is a good idea |
| 879 | # before switching between archs anyway. | 819 | # before switching between archs anyway. |
| @@ -914,7 +854,7 @@ include/linux/version.h: $(srctree)/Makefile .config .kernelrelease FORCE | |||
| 914 | 854 | ||
| 915 | # --------------------------------------------------------------------------- | 855 | # --------------------------------------------------------------------------- |
| 916 | 856 | ||
| 917 | .PHONY: depend dep | 857 | PHONY += depend dep |
| 918 | depend dep: | 858 | depend dep: |
| 919 | @echo '*** Warning: make $@ is unnecessary now.' | 859 | @echo '*** Warning: make $@ is unnecessary now.' |
| 920 | 860 | ||
| @@ -929,21 +869,21 @@ all: modules | |||
| 929 | 869 | ||
| 930 | # Build modules | 870 | # Build modules |
| 931 | 871 | ||
| 932 | .PHONY: modules | 872 | PHONY += modules |
| 933 | modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) | 873 | modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) |
| 934 | @echo ' Building modules, stage 2.'; | 874 | @echo ' Building modules, stage 2.'; |
| 935 | $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost | 875 | $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost |
| 936 | 876 | ||
| 937 | 877 | ||
| 938 | # Target to prepare building external modules | 878 | # Target to prepare building external modules |
| 939 | .PHONY: modules_prepare | 879 | PHONY += modules_prepare |
| 940 | modules_prepare: prepare scripts | 880 | modules_prepare: prepare scripts |
| 941 | 881 | ||
| 942 | # Target to install modules | 882 | # Target to install modules |
| 943 | .PHONY: modules_install | 883 | PHONY += modules_install |
| 944 | modules_install: _modinst_ _modinst_post | 884 | modules_install: _modinst_ _modinst_post |
| 945 | 885 | ||
| 946 | .PHONY: _modinst_ | 886 | PHONY += _modinst_ |
| 947 | _modinst_: | 887 | _modinst_: |
| 948 | @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \ | 888 | @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \ |
| 949 | echo "Warning: you may need to install module-init-tools"; \ | 889 | echo "Warning: you may need to install module-init-tools"; \ |
| @@ -970,7 +910,7 @@ depmod_opts := | |||
| 970 | else | 910 | else |
| 971 | depmod_opts := -b $(INSTALL_MOD_PATH) -r | 911 | depmod_opts := -b $(INSTALL_MOD_PATH) -r |
| 972 | endif | 912 | endif |
| 973 | .PHONY: _modinst_post | 913 | PHONY += _modinst_post |
| 974 | _modinst_post: _modinst_ | 914 | _modinst_post: _modinst_ |
| 975 | if [ -r System.map -a -x $(DEPMOD) ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi | 915 | if [ -r System.map -a -x $(DEPMOD) ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi |
| 976 | 916 | ||
| @@ -1013,7 +953,7 @@ clean: rm-dirs := $(CLEAN_DIRS) | |||
| 1013 | clean: rm-files := $(CLEAN_FILES) | 953 | clean: rm-files := $(CLEAN_FILES) |
| 1014 | clean-dirs := $(addprefix _clean_,$(srctree) $(vmlinux-alldirs)) | 954 | clean-dirs := $(addprefix _clean_,$(srctree) $(vmlinux-alldirs)) |
| 1015 | 955 | ||
| 1016 | .PHONY: $(clean-dirs) clean archclean | 956 | PHONY += $(clean-dirs) clean archclean |
| 1017 | $(clean-dirs): | 957 | $(clean-dirs): |
| 1018 | $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@) | 958 | $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@) |
| 1019 | 959 | ||
| @@ -1031,7 +971,7 @@ mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS)) | |||
| 1031 | mrproper: rm-files := $(wildcard $(MRPROPER_FILES)) | 971 | mrproper: rm-files := $(wildcard $(MRPROPER_FILES)) |
| 1032 | mrproper-dirs := $(addprefix _mrproper_,Documentation/DocBook scripts) | 972 | mrproper-dirs := $(addprefix _mrproper_,Documentation/DocBook scripts) |
| 1033 | 973 | ||
| 1034 | .PHONY: $(mrproper-dirs) mrproper archmrproper | 974 | PHONY += $(mrproper-dirs) mrproper archmrproper |
| 1035 | $(mrproper-dirs): | 975 | $(mrproper-dirs): |
| 1036 | $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@) | 976 | $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@) |
| 1037 | 977 | ||
| @@ -1041,7 +981,7 @@ mrproper: clean archmrproper $(mrproper-dirs) | |||
| 1041 | 981 | ||
| 1042 | # distclean | 982 | # distclean |
| 1043 | # | 983 | # |
| 1044 | .PHONY: distclean | 984 | PHONY += distclean |
| 1045 | 985 | ||
| 1046 | distclean: mrproper | 986 | distclean: mrproper |
| 1047 | @find $(srctree) $(RCS_FIND_IGNORE) \ | 987 | @find $(srctree) $(RCS_FIND_IGNORE) \ |
| @@ -1057,12 +997,10 @@ distclean: mrproper | |||
| 1057 | # rpm target kept for backward compatibility | 997 | # rpm target kept for backward compatibility |
| 1058 | package-dir := $(srctree)/scripts/package | 998 | package-dir := $(srctree)/scripts/package |
| 1059 | 999 | ||
| 1060 | .PHONY: %-pkg rpm | ||
| 1061 | |||
| 1062 | %pkg: FORCE | 1000 | %pkg: FORCE |
| 1063 | $(Q)$(MAKE) -f $(package-dir)/Makefile $@ | 1001 | $(Q)$(MAKE) $(build)=$(package-dir) $@ |
| 1064 | rpm: FORCE | 1002 | rpm: FORCE |
| 1065 | $(Q)$(MAKE) -f $(package-dir)/Makefile $@ | 1003 | $(Q)$(MAKE) $(build)=$(package-dir) $@ |
| 1066 | 1004 | ||
| 1067 | 1005 | ||
| 1068 | # Brief documentation of the typical targets used | 1006 | # Brief documentation of the typical targets used |
| @@ -1094,13 +1032,11 @@ help: | |||
| 1094 | @echo ' kernelversion - Output the version stored in Makefile' | 1032 | @echo ' kernelversion - Output the version stored in Makefile' |
| 1095 | @echo '' | 1033 | @echo '' |
| 1096 | @echo 'Static analysers' | 1034 | @echo 'Static analysers' |
| 1097 | @echo ' buildcheck - List dangling references to vmlinux discarded sections' | ||
| 1098 | @echo ' and init sections from non-init sections' | ||
| 1099 | @echo ' checkstack - Generate a list of stack hogs' | 1035 | @echo ' checkstack - Generate a list of stack hogs' |
| 1100 | @echo ' namespacecheck - Name space analysis on compiled kernel' | 1036 | @echo ' namespacecheck - Name space analysis on compiled kernel' |
| 1101 | @echo '' | 1037 | @echo '' |
| 1102 | @echo 'Kernel packaging:' | 1038 | @echo 'Kernel packaging:' |
| 1103 | @$(MAKE) -f $(package-dir)/Makefile help | 1039 | @$(MAKE) $(build)=$(package-dir) help |
| 1104 | @echo '' | 1040 | @echo '' |
| 1105 | @echo 'Documentation targets:' | 1041 | @echo 'Documentation targets:' |
| 1106 | @$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp | 1042 | @$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp |
| @@ -1149,11 +1085,12 @@ else # KBUILD_EXTMOD | |||
| 1149 | 1085 | ||
| 1150 | # We are always building modules | 1086 | # We are always building modules |
| 1151 | KBUILD_MODULES := 1 | 1087 | KBUILD_MODULES := 1 |
| 1152 | .PHONY: crmodverdir | 1088 | PHONY += crmodverdir |
| 1153 | crmodverdir: | 1089 | crmodverdir: |
| 1090 | $(Q)rm -rf $(MODVERDIR) | ||
| 1154 | $(Q)mkdir -p $(MODVERDIR) | 1091 | $(Q)mkdir -p $(MODVERDIR) |
| 1155 | 1092 | ||
| 1156 | .PHONY: $(objtree)/Module.symvers | 1093 | PHONY += $(objtree)/Module.symvers |
| 1157 | $(objtree)/Module.symvers: | 1094 | $(objtree)/Module.symvers: |
| 1158 | @test -e $(objtree)/Module.symvers || ( \ | 1095 | @test -e $(objtree)/Module.symvers || ( \ |
| 1159 | echo; \ | 1096 | echo; \ |
| @@ -1162,7 +1099,7 @@ $(objtree)/Module.symvers: | |||
| 1162 | echo ) | 1099 | echo ) |
| 1163 | 1100 | ||
| 1164 | module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD)) | 1101 | module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD)) |
| 1165 | .PHONY: $(module-dirs) modules | 1102 | PHONY += $(module-dirs) modules |
| 1166 | $(module-dirs): crmodverdir $(objtree)/Module.symvers | 1103 | $(module-dirs): crmodverdir $(objtree)/Module.symvers |
| 1167 | $(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@) | 1104 | $(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@) |
| 1168 | 1105 | ||
| @@ -1170,13 +1107,32 @@ modules: $(module-dirs) | |||
| 1170 | @echo ' Building modules, stage 2.'; | 1107 | @echo ' Building modules, stage 2.'; |
| 1171 | $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost | 1108 | $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost |
| 1172 | 1109 | ||
| 1173 | .PHONY: modules_install | 1110 | PHONY += modules_install |
| 1174 | modules_install: | 1111 | modules_install: _emodinst_ _emodinst_post |
| 1112 | |||
| 1113 | install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra) | ||
| 1114 | PHONY += _emodinst_ | ||
| 1115 | _emodinst_: | ||
| 1116 | $(Q)rm -rf $(MODLIB)/$(install-dir) | ||
| 1117 | $(Q)mkdir -p $(MODLIB)/$(install-dir) | ||
| 1175 | $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst | 1118 | $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst |
| 1176 | 1119 | ||
| 1120 | # Run depmod only is we have System.map and depmod is executable | ||
| 1121 | quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) | ||
| 1122 | cmd_depmod = if [ -r System.map -a -x $(DEPMOD) ]; then \ | ||
| 1123 | $(DEPMOD) -ae -F System.map \ | ||
| 1124 | $(if $(strip $(INSTALL_MOD_PATH)), \ | ||
| 1125 | -b $(INSTALL_MOD_PATH) -r) \ | ||
| 1126 | $(KERNELRELEASE); \ | ||
| 1127 | fi | ||
| 1128 | |||
| 1129 | PHONY += _emodinst_post | ||
| 1130 | _emodinst_post: _emodinst_ | ||
| 1131 | $(call cmd,depmod) | ||
| 1132 | |||
| 1177 | clean-dirs := $(addprefix _clean_,$(KBUILD_EXTMOD)) | 1133 | clean-dirs := $(addprefix _clean_,$(KBUILD_EXTMOD)) |
| 1178 | 1134 | ||
| 1179 | .PHONY: $(clean-dirs) clean | 1135 | PHONY += $(clean-dirs) clean |
| 1180 | $(clean-dirs): | 1136 | $(clean-dirs): |
| 1181 | $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@) | 1137 | $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@) |
| 1182 | 1138 | ||
| @@ -1196,6 +1152,11 @@ help: | |||
| 1196 | @echo ' modules_install - install the module' | 1152 | @echo ' modules_install - install the module' |
| 1197 | @echo ' clean - remove generated files in module directory only' | 1153 | @echo ' clean - remove generated files in module directory only' |
| 1198 | @echo '' | 1154 | @echo '' |
| 1155 | |||
| 1156 | # Dummies... | ||
| 1157 | PHONY += prepare scripts | ||
| 1158 | prepare: ; | ||
| 1159 | scripts: ; | ||
| 1199 | endif # KBUILD_EXTMOD | 1160 | endif # KBUILD_EXTMOD |
| 1200 | 1161 | ||
| 1201 | # Generate tags for editors | 1162 | # Generate tags for editors |
| @@ -1296,17 +1257,13 @@ versioncheck: | |||
| 1296 | -name '*.[hcS]' -type f -print | sort \ | 1257 | -name '*.[hcS]' -type f -print | sort \ |
| 1297 | | xargs $(PERL) -w scripts/checkversion.pl | 1258 | | xargs $(PERL) -w scripts/checkversion.pl |
| 1298 | 1259 | ||
| 1299 | buildcheck: | ||
| 1300 | $(PERL) $(srctree)/scripts/reference_discarded.pl | ||
| 1301 | $(PERL) $(srctree)/scripts/reference_init.pl | ||
| 1302 | |||
| 1303 | namespacecheck: | 1260 | namespacecheck: |
| 1304 | $(PERL) $(srctree)/scripts/namespace.pl | 1261 | $(PERL) $(srctree)/scripts/namespace.pl |
| 1305 | 1262 | ||
| 1306 | endif #ifeq ($(config-targets),1) | 1263 | endif #ifeq ($(config-targets),1) |
| 1307 | endif #ifeq ($(mixed-targets),1) | 1264 | endif #ifeq ($(mixed-targets),1) |
| 1308 | 1265 | ||
| 1309 | .PHONY: checkstack | 1266 | PHONY += checkstack |
| 1310 | checkstack: | 1267 | checkstack: |
| 1311 | $(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \ | 1268 | $(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \ |
| 1312 | $(PERL) $(src)/scripts/checkstack.pl $(ARCH) | 1269 | $(PERL) $(src)/scripts/checkstack.pl $(ARCH) |
| @@ -1317,6 +1274,44 @@ kernelrelease: | |||
| 1317 | kernelversion: | 1274 | kernelversion: |
| 1318 | @echo $(KERNELVERSION) | 1275 | @echo $(KERNELVERSION) |
| 1319 | 1276 | ||
| 1277 | # Single targets | ||
| 1278 | # --------------------------------------------------------------------------- | ||
| 1279 | # The directory part is taken from first prerequisite, so this | ||
| 1280 | # works even with external modules | ||
| 1281 | %.s: %.c prepare scripts FORCE | ||
| 1282 | $(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||
| 1283 | %.i: %.c prepare scripts FORCE | ||
| 1284 | $(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||
| 1285 | %.o: %.c prepare scripts FORCE | ||
| 1286 | $(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||
| 1287 | %.lst: %.c prepare scripts FORCE | ||
| 1288 | $(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||
| 1289 | %.s: %.S prepare scripts FORCE | ||
| 1290 | $(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||
| 1291 | %.o: %.S prepare scripts FORCE | ||
| 1292 | $(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||
| 1293 | |||
| 1294 | # For external modules we shall include any directory of the target, | ||
| 1295 | # but usual case there is no directory part. | ||
| 1296 | # make M=`pwd` module.o => $(dir $@)=./ | ||
| 1297 | # make M=`pwd` foo/module.o => $(dir $@)=foo/ | ||
| 1298 | # make M=`pwd` / => $(dir $@)=/ | ||
| 1299 | |||
| 1300 | ifeq ($(KBUILD_EXTMOD),) | ||
| 1301 | target-dir = $(@D) | ||
| 1302 | else | ||
| 1303 | zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@))) | ||
| 1304 | target-dir = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash)) | ||
| 1305 | endif | ||
| 1306 | |||
| 1307 | / %/: scripts prepare FORCE | ||
| 1308 | $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ | ||
| 1309 | $(build)=$(target-dir) | ||
| 1310 | %.ko: scripts FORCE | ||
| 1311 | $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ | ||
| 1312 | $(build)=$(target-dir) $(@:.ko=.o) | ||
| 1313 | $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost | ||
| 1314 | |||
| 1320 | # FIXME Should go into a make.lib or something | 1315 | # FIXME Should go into a make.lib or something |
| 1321 | # =========================================================================== | 1316 | # =========================================================================== |
| 1322 | 1317 | ||
| @@ -1351,4 +1346,10 @@ clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj | |||
| 1351 | 1346 | ||
| 1352 | endif # skip-makefile | 1347 | endif # skip-makefile |
| 1353 | 1348 | ||
| 1349 | PHONY += FORCE | ||
| 1354 | FORCE: | 1350 | FORCE: |
| 1351 | |||
| 1352 | |||
| 1353 | # Declare the contents of the .PHONY variable as phony. We keep that | ||
| 1354 | # information in a variable se we can use it in if_changed and friends. | ||
| 1355 | .PHONY: $(PHONY) | ||
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index b5b1e4087516..99c0d323719a 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | # | 1 | # |
| 2 | # arch/arm/Makefile | 2 | # arch/arm/Makefile |
| 3 | # | 3 | # |
| 4 | # This file is included by the global makefile so that you can add your own | ||
| 5 | # architecture-specific flags and dependencies. | ||
| 6 | # | ||
| 4 | # This file is subject to the terms and conditions of the GNU General Public | 7 | # This file is subject to the terms and conditions of the GNU General Public |
| 5 | # License. See the file "COPYING" in the main directory of this archive | 8 | # License. See the file "COPYING" in the main directory of this archive |
| 6 | # for more details. | 9 | # for more details. |
| @@ -177,7 +180,7 @@ endif | |||
| 177 | 180 | ||
| 178 | archprepare: maketools | 181 | archprepare: maketools |
| 179 | 182 | ||
| 180 | .PHONY: maketools FORCE | 183 | PHONY += maketools FORCE |
| 181 | maketools: include/linux/version.h include/asm-arm/.arch FORCE | 184 | maketools: include/linux/version.h include/asm-arm/.arch FORCE |
| 182 | $(Q)$(MAKE) $(build)=arch/arm/tools include/asm-arm/mach-types.h | 185 | $(Q)$(MAKE) $(build)=arch/arm/tools include/asm-arm/mach-types.h |
| 183 | 186 | ||
diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile index a174d63395ea..ec9c400c7f82 100644 --- a/arch/arm/boot/Makefile +++ b/arch/arm/boot/Makefile | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | # | 1 | # |
| 2 | # arch/arm/boot/Makefile | 2 | # arch/arm/boot/Makefile |
| 3 | # | 3 | # |
| 4 | # This file is included by the global makefile so that you can add your own | ||
| 5 | # architecture-specific flags and dependencies. | ||
| 6 | # | ||
| 4 | # This file is subject to the terms and conditions of the GNU General Public | 7 | # This file is subject to the terms and conditions of the GNU General Public |
| 5 | # License. See the file "COPYING" in the main directory of this archive | 8 | # License. See the file "COPYING" in the main directory of this archive |
| 6 | # for more details. | 9 | # for more details. |
| @@ -73,7 +76,7 @@ $(obj)/bootpImage: $(obj)/bootp/bootp FORCE | |||
| 73 | $(call if_changed,objcopy) | 76 | $(call if_changed,objcopy) |
| 74 | @echo ' Kernel: $@ is ready' | 77 | @echo ' Kernel: $@ is ready' |
| 75 | 78 | ||
| 76 | .PHONY: initrd FORCE | 79 | PHONY += initrd FORCE |
| 77 | initrd: | 80 | initrd: |
| 78 | @test "$(INITRD_PHYS)" != "" || \ | 81 | @test "$(INITRD_PHYS)" != "" || \ |
| 79 | (echo This machine does not support INITRD; exit -1) | 82 | (echo This machine does not support INITRD; exit -1) |
diff --git a/arch/arm/boot/bootp/Makefile b/arch/arm/boot/bootp/Makefile index 8e8879b6b3d7..c394e305447c 100644 --- a/arch/arm/boot/bootp/Makefile +++ b/arch/arm/boot/bootp/Makefile | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | # | 1 | # |
| 2 | # linux/arch/arm/boot/bootp/Makefile | 2 | # linux/arch/arm/boot/bootp/Makefile |
| 3 | # | 3 | # |
| 4 | # This file is included by the global makefile so that you can add your own | ||
| 5 | # architecture-specific flags and dependencies. | ||
| 6 | # | ||
| 4 | 7 | ||
| 5 | LDFLAGS_bootp :=-p --no-undefined -X \ | 8 | LDFLAGS_bootp :=-p --no-undefined -X \ |
| 6 | --defsym initrd_phys=$(INITRD_PHYS) \ | 9 | --defsym initrd_phys=$(INITRD_PHYS) \ |
| @@ -21,4 +24,4 @@ $(obj)/kernel.o: arch/arm/boot/zImage FORCE | |||
| 21 | 24 | ||
| 22 | $(obj)/initrd.o: $(INITRD) FORCE | 25 | $(obj)/initrd.o: $(INITRD) FORCE |
| 23 | 26 | ||
| 24 | .PHONY: $(INITRD) FORCE | 27 | PHONY += $(INITRD) FORCE |
diff --git a/arch/arm26/Makefile b/arch/arm26/Makefile index 844a9e46886e..fe91eda98a94 100644 --- a/arch/arm26/Makefile +++ b/arch/arm26/Makefile | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | # | 1 | # |
| 2 | # arch/arm26/Makefile | 2 | # arch/arm26/Makefile |
| 3 | # | 3 | # |
| 4 | # This file is included by the global makefile so that you can add your own | ||
| 5 | # architecture-specific flags and dependencies. | ||
| 6 | # | ||
| 4 | # This file is subject to the terms and conditions of the GNU General Public | 7 | # This file is subject to the terms and conditions of the GNU General Public |
| 5 | # License. See the file "COPYING" in the main directory of this archive | 8 | # License. See the file "COPYING" in the main directory of this archive |
| 6 | # for more details. | 9 | # for more details. |
| @@ -49,9 +52,9 @@ all: zImage | |||
| 49 | 52 | ||
| 50 | boot := arch/arm26/boot | 53 | boot := arch/arm26/boot |
| 51 | 54 | ||
| 52 | .PHONY: maketools FORCE | 55 | PHONY += maketools FORCE |
| 53 | maketools: FORCE | 56 | maketools: FORCE |
| 54 | 57 | ||
| 55 | 58 | ||
| 56 | # Convert bzImage to zImage | 59 | # Convert bzImage to zImage |
| 57 | bzImage: vmlinux | 60 | bzImage: vmlinux |
diff --git a/arch/arm26/boot/Makefile b/arch/arm26/boot/Makefile index b5c2277654d4..68acb7b0d47f 100644 --- a/arch/arm26/boot/Makefile +++ b/arch/arm26/boot/Makefile | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | # | 1 | # |
| 2 | # arch/arm26/boot/Makefile | 2 | # arch/arm26/boot/Makefile |
| 3 | # | 3 | # |
| 4 | # This file is included by the global makefile so that you can add your own | ||
| 5 | # architecture-specific flags and dependencies. | ||
| 6 | # | ||
| 4 | # This file is subject to the terms and conditions of the GNU General Public | 7 | # This file is subject to the terms and conditions of the GNU General Public |
| 5 | # License. See the file "COPYING" in the main directory of this archive | 8 | # License. See the file "COPYING" in the main directory of this archive |
| 6 | # for more details. | 9 | # for more details. |
| @@ -60,7 +63,7 @@ $(obj)/xipImage: vmlinux FORCE | |||
| 60 | @echo ' Kernel: $@ is ready' | 63 | @echo ' Kernel: $@ is ready' |
| 61 | endif | 64 | endif |
| 62 | 65 | ||
| 63 | .PHONY: initrd | 66 | PHONY += initrd |
| 64 | initrd: | 67 | initrd: |
| 65 | @test "$(INITRD_PHYS)" != "" || \ | 68 | @test "$(INITRD_PHYS)" != "" || \ |
| 66 | (echo This machine does not support INITRD; exit -1) | 69 | (echo This machine does not support INITRD; exit -1) |
diff --git a/arch/i386/Makefile b/arch/i386/Makefile index 36bef6543ac1..ff6973a85c8f 100644 --- a/arch/i386/Makefile +++ b/arch/i386/Makefile | |||
| @@ -99,8 +99,8 @@ AFLAGS += $(mflags-y) | |||
| 99 | 99 | ||
| 100 | boot := arch/i386/boot | 100 | boot := arch/i386/boot |
| 101 | 101 | ||
| 102 | .PHONY: zImage bzImage compressed zlilo bzlilo \ | 102 | PHONY += zImage bzImage compressed zlilo bzlilo \ |
| 103 | zdisk bzdisk fdimage fdimage144 fdimage288 install | 103 | zdisk bzdisk fdimage fdimage144 fdimage288 install |
| 104 | 104 | ||
| 105 | all: bzImage | 105 | all: bzImage |
| 106 | 106 | ||
diff --git a/arch/i386/kernel/vmlinux.lds.S b/arch/i386/kernel/vmlinux.lds.S index 3f21c6f6466d..8831303a473f 100644 --- a/arch/i386/kernel/vmlinux.lds.S +++ b/arch/i386/kernel/vmlinux.lds.S | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <asm-generic/vmlinux.lds.h> | 7 | #include <asm-generic/vmlinux.lds.h> |
| 8 | #include <asm/thread_info.h> | 8 | #include <asm/thread_info.h> |
| 9 | #include <asm/page.h> | 9 | #include <asm/page.h> |
| 10 | #include <asm/cache.h> | ||
| 10 | 11 | ||
| 11 | OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") | 12 | OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") |
| 12 | OUTPUT_ARCH(i386) | 13 | OUTPUT_ARCH(i386) |
| @@ -135,7 +136,7 @@ SECTIONS | |||
| 135 | __initramfs_start = .; | 136 | __initramfs_start = .; |
| 136 | .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) } | 137 | .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) } |
| 137 | __initramfs_end = .; | 138 | __initramfs_end = .; |
| 138 | . = ALIGN(32); | 139 | . = ALIGN(L1_CACHE_BYTES); |
| 139 | __per_cpu_start = .; | 140 | __per_cpu_start = .; |
| 140 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) } | 141 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) } |
| 141 | __per_cpu_end = .; | 142 | __per_cpu_end = .; |
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index f722e1a25948..80ea7506fa1a 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | # | 1 | # |
| 2 | # ia64/Makefile | 2 | # ia64/Makefile |
| 3 | # | 3 | # |
| 4 | # This file is included by the global makefile so that you can add your own | ||
| 5 | # architecture-specific flags and dependencies. | ||
| 6 | # | ||
| 4 | # This file is subject to the terms and conditions of the GNU General Public | 7 | # This file is subject to the terms and conditions of the GNU General Public |
| 5 | # License. See the file "COPYING" in the main directory of this archive | 8 | # License. See the file "COPYING" in the main directory of this archive |
| 6 | # for more details. | 9 | # for more details. |
| @@ -62,7 +65,7 @@ drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/ | |||
| 62 | 65 | ||
| 63 | boot := arch/ia64/hp/sim/boot | 66 | boot := arch/ia64/hp/sim/boot |
| 64 | 67 | ||
| 65 | .PHONY: boot compressed check | 68 | PHONY += boot compressed check |
| 66 | 69 | ||
| 67 | all: compressed unwcheck | 70 | all: compressed unwcheck |
| 68 | 71 | ||
diff --git a/arch/m32r/Makefile b/arch/m32r/Makefile index 4b3c90ba926c..f219c47d334f 100644 --- a/arch/m32r/Makefile +++ b/arch/m32r/Makefile | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | # | 1 | # |
| 2 | # m32r/Makefile | 2 | # m32r/Makefile |
| 3 | # | 3 | # |
| 4 | # This file is included by the global makefile so that you can add your own | ||
| 5 | # architecture-specific flags and dependencies. | ||
| 6 | # | ||
| 4 | 7 | ||
| 5 | LDFLAGS := | 8 | LDFLAGS := |
| 6 | OBJCOPYFLAGS := -O binary -R .note -R .comment -S | 9 | OBJCOPYFLAGS := -O binary -R .note -R .comment -S |
| @@ -39,7 +42,7 @@ drivers-$(CONFIG_OPROFILE) += arch/m32r/oprofile/ | |||
| 39 | 42 | ||
| 40 | boot := arch/m32r/boot | 43 | boot := arch/m32r/boot |
| 41 | 44 | ||
| 42 | .PHONY: zImage | 45 | PHONY += zImage |
| 43 | 46 | ||
| 44 | all: zImage | 47 | all: zImage |
| 45 | 48 | ||
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index a3fc7a23158f..829e017b8a54 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
| @@ -150,7 +150,7 @@ CPPFLAGS_vmlinux.lds := -Upowerpc | |||
| 150 | 150 | ||
| 151 | BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage vmlinux.bin | 151 | BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage vmlinux.bin |
| 152 | 152 | ||
| 153 | .PHONY: $(BOOT_TARGETS) | 153 | PHONY += $(BOOT_TARGETS) |
| 154 | 154 | ||
| 155 | boot := arch/$(ARCH)/boot | 155 | boot := arch/$(ARCH)/boot |
| 156 | 156 | ||
diff --git a/arch/ppc/Makefile b/arch/ppc/Makefile index 98e940beeb3b..9fbdf54ba2be 100644 --- a/arch/ppc/Makefile +++ b/arch/ppc/Makefile | |||
| @@ -82,7 +82,7 @@ drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/ | |||
| 82 | 82 | ||
| 83 | BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm | 83 | BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm |
| 84 | 84 | ||
| 85 | .PHONY: $(BOOT_TARGETS) | 85 | PHONY += $(BOOT_TARGETS) |
| 86 | 86 | ||
| 87 | all: uImage zImage | 87 | all: uImage zImage |
| 88 | 88 | ||
diff --git a/arch/ppc/boot/Makefile b/arch/ppc/boot/Makefile index f565699a9fe0..84eec0bef93c 100644 --- a/arch/ppc/boot/Makefile +++ b/arch/ppc/boot/Makefile | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | # | ||
| 2 | # arch/ppc/boot/Makefile | ||
| 3 | # | ||
| 4 | # This file is included by the global makefile so that you can add your own | ||
| 5 | # architecture-specific flags and dependencies. | ||
| 6 | # | ||
| 1 | # This file is subject to the terms and conditions of the GNU General Public | 7 | # This file is subject to the terms and conditions of the GNU General Public |
| 2 | # License. See the file "COPYING" in the main directory of this archive | 8 | # License. See the file "COPYING" in the main directory of this archive |
| 3 | # for more details. | 9 | # for more details. |
| @@ -22,7 +28,7 @@ subdir- += simple openfirmware | |||
| 22 | 28 | ||
| 23 | hostprogs-y := $(addprefix utils/, addnote mknote hack-coff mkprep mkbugboot mktree) | 29 | hostprogs-y := $(addprefix utils/, addnote mknote hack-coff mkprep mkbugboot mktree) |
| 24 | 30 | ||
| 25 | .PHONY: $(BOOT_TARGETS) $(bootdir-y) | 31 | PHONY += $(BOOT_TARGETS) $(bootdir-y) |
| 26 | 32 | ||
| 27 | $(BOOT_TARGETS): $(bootdir-y) | 33 | $(BOOT_TARGETS): $(bootdir-y) |
| 28 | 34 | ||
diff --git a/arch/ppc/boot/openfirmware/Makefile b/arch/ppc/boot/openfirmware/Makefile index 2a411ec2e650..66b739743759 100644 --- a/arch/ppc/boot/openfirmware/Makefile +++ b/arch/ppc/boot/openfirmware/Makefile | |||
| @@ -1,5 +1,8 @@ | |||
| 1 | # Makefile for making bootable images on various OpenFirmware machines. | 1 | # Makefile for making bootable images on various OpenFirmware machines. |
| 2 | # | 2 | # |
| 3 | # This file is included by the global makefile so that you can add your own | ||
| 4 | # architecture-specific flags and dependencies. | ||
| 5 | # | ||
| 3 | # Paul Mackerras January 1997 | 6 | # Paul Mackerras January 1997 |
| 4 | # XCOFF bootable images for PowerMacs | 7 | # XCOFF bootable images for PowerMacs |
| 5 | # Geert Uytterhoeven September 1997 | 8 | # Geert Uytterhoeven September 1997 |
| @@ -86,7 +89,7 @@ $(images)/zImage.chrp-rs6k $(images)/zImage.initrd.chrp-rs6k: \ | |||
| 86 | 89 | ||
| 87 | # The targets used on the make command-line | 90 | # The targets used on the make command-line |
| 88 | 91 | ||
| 89 | .PHONY: zImage zImage.initrd | 92 | PHONY += zImage zImage.initrd |
| 90 | zImage: $(images)/zImage.chrp \ | 93 | zImage: $(images)/zImage.chrp \ |
| 91 | $(images)/zImage.chrp-rs6k | 94 | $(images)/zImage.chrp-rs6k |
| 92 | @echo ' kernel: $@ is ready ($<)' | 95 | @echo ' kernel: $@ is ready ($<)' |
| @@ -96,7 +99,7 @@ zImage.initrd: $(images)/zImage.initrd.chrp \ | |||
| 96 | 99 | ||
| 97 | TFTPIMAGE := /tftpboot/zImage | 100 | TFTPIMAGE := /tftpboot/zImage |
| 98 | 101 | ||
| 99 | .PHONY: znetboot znetboot.initrd | 102 | PHONY += znetboot znetboot.initrd |
| 100 | znetboot: $(images)/zImage.chrp | 103 | znetboot: $(images)/zImage.chrp |
| 101 | cp $(images)/zImage.chrp $(TFTPIMAGE).chrp$(END) | 104 | cp $(images)/zImage.chrp $(TFTPIMAGE).chrp$(END) |
| 102 | @echo ' kernel: $@ is ready ($<)' | 105 | @echo ' kernel: $@ is ready ($<)' |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index 08c9515c4806..c72e17a96eed 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
| @@ -172,7 +172,7 @@ include/asm-sh/.mach: $(wildcard include/config/sh/*.h) include/config/MARKER | |||
| 172 | 172 | ||
| 173 | archprepare: maketools include/asm-sh/.cpu include/asm-sh/.mach | 173 | archprepare: maketools include/asm-sh/.cpu include/asm-sh/.mach |
| 174 | 174 | ||
| 175 | .PHONY: maketools FORCE | 175 | PHONY += maketools FORCE |
| 176 | maketools: include/linux/version.h FORCE | 176 | maketools: include/linux/version.h FORCE |
| 177 | $(Q)$(MAKE) $(build)=arch/sh/tools include/asm-sh/machtypes.h | 177 | $(Q)$(MAKE) $(build)=arch/sh/tools include/asm-sh/machtypes.h |
| 178 | 178 | ||
diff --git a/arch/um/Makefile b/arch/um/Makefile index c58b657f0097..8d14c7a831be 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile | |||
| @@ -1,4 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # This file is included by the global makefile so that you can add your own | ||
| 3 | # architecture-specific flags and dependencies. | ||
| 4 | # | ||
| 2 | # Copyright (C) 2002 Jeff Dike (jdike@karaya.com) | 5 | # Copyright (C) 2002 Jeff Dike (jdike@karaya.com) |
| 3 | # Licensed under the GPL | 6 | # Licensed under the GPL |
| 4 | # | 7 | # |
| @@ -88,7 +91,7 @@ CONFIG_KERNEL_HALF_GIGS ?= 0 | |||
| 88 | 91 | ||
| 89 | SIZE = (($(CONFIG_NEST_LEVEL) + $(CONFIG_KERNEL_HALF_GIGS)) * 0x20000000) | 92 | SIZE = (($(CONFIG_NEST_LEVEL) + $(CONFIG_KERNEL_HALF_GIGS)) * 0x20000000) |
| 90 | 93 | ||
| 91 | .PHONY: linux | 94 | PHONY += linux |
| 92 | 95 | ||
| 93 | all: linux | 96 | all: linux |
| 94 | 97 | ||
diff --git a/arch/x86_64/Makefile b/arch/x86_64/Makefile index d7fd46479c55..7405dfd6522b 100644 --- a/arch/x86_64/Makefile +++ b/arch/x86_64/Makefile | |||
| @@ -67,8 +67,8 @@ drivers-$(CONFIG_OPROFILE) += arch/x86_64/oprofile/ | |||
| 67 | 67 | ||
| 68 | boot := arch/x86_64/boot | 68 | boot := arch/x86_64/boot |
| 69 | 69 | ||
| 70 | .PHONY: bzImage bzlilo install archmrproper \ | 70 | PHONY += bzImage bzlilo install archmrproper \ |
| 71 | fdimage fdimage144 fdimage288 archclean | 71 | fdimage fdimage144 fdimage288 archclean |
| 72 | 72 | ||
| 73 | #Default target when executing "make" | 73 | #Default target when executing "make" |
| 74 | all: bzImage | 74 | all: bzImage |
diff --git a/drivers/atm/.gitignore b/drivers/atm/.gitignore new file mode 100644 index 000000000000..a165b7167714 --- /dev/null +++ b/drivers/atm/.gitignore | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | # Ignore generated files | ||
| 2 | fore200e_mkfirm | ||
| 3 | fore200e_pca_fw.c | ||
| 4 | pca200e.bin | ||
| 5 | |||
diff --git a/drivers/video/matrox/matroxfb_DAC1064.c b/drivers/video/matrox/matroxfb_DAC1064.c index 0fbd9b5149f1..a456e67a5b00 100644 --- a/drivers/video/matrox/matroxfb_DAC1064.c +++ b/drivers/video/matrox/matroxfb_DAC1064.c | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | * | 12 | * |
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | /* make checkconfig does not walk through include tree :-( */ | ||
| 16 | #include <linux/config.h> | 15 | #include <linux/config.h> |
| 17 | 16 | ||
| 18 | #include "matroxfb_DAC1064.h" | 17 | #include "matroxfb_DAC1064.h" |
diff --git a/drivers/video/matrox/matroxfb_DAC1064.h b/drivers/video/matrox/matroxfb_DAC1064.h index a6a470127289..2e7238aa2432 100644 --- a/drivers/video/matrox/matroxfb_DAC1064.h +++ b/drivers/video/matrox/matroxfb_DAC1064.h | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | #ifndef __MATROXFB_DAC1064_H__ | 1 | #ifndef __MATROXFB_DAC1064_H__ |
| 2 | #define __MATROXFB_DAC1064_H__ | 2 | #define __MATROXFB_DAC1064_H__ |
| 3 | 3 | ||
| 4 | /* make checkconfig does not walk through include tree */ | ||
| 5 | #include <linux/config.h> | 4 | #include <linux/config.h> |
| 6 | 5 | ||
| 7 | #include "matroxfb_base.h" | 6 | #include "matroxfb_base.h" |
diff --git a/drivers/video/matrox/matroxfb_Ti3026.c b/drivers/video/matrox/matroxfb_Ti3026.c index 537ade5d8b21..23ebad0a12d8 100644 --- a/drivers/video/matrox/matroxfb_Ti3026.c +++ b/drivers/video/matrox/matroxfb_Ti3026.c | |||
| @@ -78,7 +78,6 @@ | |||
| 78 | * | 78 | * |
| 79 | */ | 79 | */ |
| 80 | 80 | ||
| 81 | /* make checkconfig does not verify included files... */ | ||
| 82 | #include <linux/config.h> | 81 | #include <linux/config.h> |
| 83 | 82 | ||
| 84 | #include "matroxfb_Ti3026.h" | 83 | #include "matroxfb_Ti3026.h" |
diff --git a/drivers/video/matrox/matroxfb_Ti3026.h b/drivers/video/matrox/matroxfb_Ti3026.h index 541933d7e4ea..536e5f69de9f 100644 --- a/drivers/video/matrox/matroxfb_Ti3026.h +++ b/drivers/video/matrox/matroxfb_Ti3026.h | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | #ifndef __MATROXFB_TI3026_H__ | 1 | #ifndef __MATROXFB_TI3026_H__ |
| 2 | #define __MATROXFB_TI3026_H__ | 2 | #define __MATROXFB_TI3026_H__ |
| 3 | 3 | ||
| 4 | /* make checkconfig does not walk through whole include tree */ | ||
| 5 | #include <linux/config.h> | 4 | #include <linux/config.h> |
| 6 | 5 | ||
| 7 | #include "matroxfb_base.h" | 6 | #include "matroxfb_base.h" |
diff --git a/drivers/video/matrox/matroxfb_base.c b/drivers/video/matrox/matroxfb_base.c index 4055ff6f5a81..951c9974a1d3 100644 --- a/drivers/video/matrox/matroxfb_base.c +++ b/drivers/video/matrox/matroxfb_base.c | |||
| @@ -99,7 +99,6 @@ | |||
| 99 | * | 99 | * |
| 100 | */ | 100 | */ |
| 101 | 101 | ||
| 102 | /* make checkconfig does not check included files... */ | ||
| 103 | #include <linux/config.h> | 102 | #include <linux/config.h> |
| 104 | #include <linux/version.h> | 103 | #include <linux/version.h> |
| 105 | 104 | ||
diff --git a/drivers/video/matrox/matroxfb_misc.c b/drivers/video/matrox/matroxfb_misc.c index 455a46ce840c..263d801ef78f 100644 --- a/drivers/video/matrox/matroxfb_misc.c +++ b/drivers/video/matrox/matroxfb_misc.c | |||
| @@ -84,7 +84,6 @@ | |||
| 84 | * | 84 | * |
| 85 | */ | 85 | */ |
| 86 | 86 | ||
| 87 | /* make checkconfig does not check includes for this... */ | ||
| 88 | #include <linux/config.h> | 87 | #include <linux/config.h> |
| 89 | 88 | ||
| 90 | #include "matroxfb_misc.h" | 89 | #include "matroxfb_misc.h" |
diff --git a/init/Kconfig b/init/Kconfig index 05951c1d654e..3b36a1d53656 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
| @@ -365,43 +365,6 @@ config SHMEM | |||
| 365 | option replaces shmem and tmpfs with the much simpler ramfs code, | 365 | option replaces shmem and tmpfs with the much simpler ramfs code, |
| 366 | which may be appropriate on small systems without swap. | 366 | which may be appropriate on small systems without swap. |
| 367 | 367 | ||
| 368 | config CC_ALIGN_FUNCTIONS | ||
| 369 | int "Function alignment" if EMBEDDED | ||
| 370 | default 0 | ||
| 371 | help | ||
| 372 | Align the start of functions to the next power-of-two greater than n, | ||
| 373 | skipping up to n bytes. For instance, 32 aligns functions | ||
| 374 | to the next 32-byte boundary, but 24 would align to the next | ||
| 375 | 32-byte boundary only if this can be done by skipping 23 bytes or less. | ||
| 376 | Zero means use compiler's default. | ||
| 377 | |||
| 378 | config CC_ALIGN_LABELS | ||
| 379 | int "Label alignment" if EMBEDDED | ||
| 380 | default 0 | ||
| 381 | help | ||
| 382 | Align all branch targets to a power-of-two boundary, skipping | ||
| 383 | up to n bytes like ALIGN_FUNCTIONS. This option can easily | ||
| 384 | make code slower, because it must insert dummy operations for | ||
| 385 | when the branch target is reached in the usual flow of the code. | ||
| 386 | Zero means use compiler's default. | ||
| 387 | |||
| 388 | config CC_ALIGN_LOOPS | ||
| 389 | int "Loop alignment" if EMBEDDED | ||
| 390 | default 0 | ||
| 391 | help | ||
| 392 | Align loops to a power-of-two boundary, skipping up to n bytes. | ||
| 393 | Zero means use compiler's default. | ||
| 394 | |||
| 395 | config CC_ALIGN_JUMPS | ||
| 396 | int "Jump alignment" if EMBEDDED | ||
| 397 | default 0 | ||
| 398 | help | ||
| 399 | Align branch targets to a power-of-two boundary, for branch | ||
| 400 | targets where the targets can only be reached by jumping, | ||
| 401 | skipping up to n bytes like ALIGN_FUNCTIONS. In this case, | ||
| 402 | no dummy operations need be executed. | ||
| 403 | Zero means use compiler's default. | ||
| 404 | |||
| 405 | config SLAB | 368 | config SLAB |
| 406 | default y | 369 | default y |
| 407 | bool "Use full SLAB allocator" if EMBEDDED | 370 | bool "Use full SLAB allocator" if EMBEDDED |
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 0168d6c37075..59620b1554e0 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include | |||
| @@ -44,6 +44,43 @@ define filechk | |||
| 44 | fi | 44 | fi |
| 45 | endef | 45 | endef |
| 46 | 46 | ||
| 47 | ###### | ||
| 48 | # gcc support functions | ||
| 49 | # See documentation in Documentation/kbuild/makefiles.txt | ||
| 50 | |||
| 51 | # as-option | ||
| 52 | # Usage: cflags-y += $(call as-option, -Wa$(comma)-isa=foo,) | ||
| 53 | |||
| 54 | as-option = $(shell if $(CC) $(CFLAGS) $(1) -Wa,-Z -c -o /dev/null \ | ||
| 55 | -xassembler /dev/null > /dev/null 2>&1; then echo "$(1)"; \ | ||
| 56 | else echo "$(2)"; fi ;) | ||
| 57 | |||
| 58 | # cc-option | ||
| 59 | # Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586) | ||
| 60 | |||
| 61 | cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ | ||
| 62 | > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) | ||
| 63 | |||
| 64 | # cc-option-yn | ||
| 65 | # Usage: flag := $(call cc-option-yn, -march=winchip-c6) | ||
| 66 | cc-option-yn = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ | ||
| 67 | > /dev/null 2>&1; then echo "y"; else echo "n"; fi;) | ||
| 68 | |||
| 69 | # cc-option-align | ||
| 70 | # Prefix align with either -falign or -malign | ||
| 71 | cc-option-align = $(subst -functions=0,,\ | ||
| 72 | $(call cc-option,-falign-functions=0,-malign-functions=0)) | ||
| 73 | |||
| 74 | # cc-version | ||
| 75 | # Usage gcc-ver := $(call cc-version, $(CC)) | ||
| 76 | cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh \ | ||
| 77 | $(if $(1), $(1), $(CC))) | ||
| 78 | |||
| 79 | # cc-ifversion | ||
| 80 | # Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) | ||
| 81 | cc-ifversion = $(shell if [ $(call cc-version, $(CC)) $(1) $(2) ]; then \ | ||
| 82 | echo $(3); fi;) | ||
| 83 | |||
| 47 | ### | 84 | ### |
| 48 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj= | 85 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj= |
| 49 | # Usage: | 86 | # Usage: |
| @@ -51,8 +88,7 @@ endef | |||
| 51 | build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj | 88 | build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj |
| 52 | 89 | ||
| 53 | # If quiet is set, only print short version of command | 90 | # If quiet is set, only print short version of command |
| 54 | cmd = @$(if $($(quiet)cmd_$(1)),\ | 91 | cmd = @$(echo-cmd) $(cmd_$(1)) |
| 55 | echo ' $(call escsq,$($(quiet)cmd_$(1)))' &&) $(cmd_$(1)) | ||
| 56 | 92 | ||
| 57 | # Add $(obj)/ for paths that is not absolute | 93 | # Add $(obj)/ for paths that is not absolute |
| 58 | objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o))) | 94 | objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o))) |
| @@ -75,30 +111,33 @@ endif | |||
| 75 | echo-cmd = $(if $($(quiet)cmd_$(1)), \ | 111 | echo-cmd = $(if $($(quiet)cmd_$(1)), \ |
| 76 | echo ' $(call escsq,$($(quiet)cmd_$(1)))';) | 112 | echo ' $(call escsq,$($(quiet)cmd_$(1)))';) |
| 77 | 113 | ||
| 114 | make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))) | ||
| 115 | |||
| 78 | # function to only execute the passed command if necessary | 116 | # function to only execute the passed command if necessary |
| 79 | # >'< substitution is for echo to work, >$< substitution to preserve $ when reloading .cmd file | 117 | # >'< substitution is for echo to work, >$< substitution to preserve $ when reloading .cmd file |
| 80 | # note: when using inline perl scripts [perl -e '...$$t=1;...'] in $(cmd_xxx) double $$ your perl vars | 118 | # note: when using inline perl scripts [perl -e '...$$t=1;...'] in $(cmd_xxx) double $$ your perl vars |
| 81 | # | 119 | # |
| 82 | if_changed = $(if $(strip $? $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \ | 120 | if_changed = $(if $(strip $(filter-out $(PHONY),$?) \ |
| 121 | $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \ | ||
| 83 | @set -e; \ | 122 | @set -e; \ |
| 84 | $(echo-cmd) \ | 123 | $(echo-cmd) $(cmd_$(1)); \ |
| 85 | $(cmd_$(1)); \ | 124 | echo 'cmd_$@ := $(make-cmd)' > $(@D)/.$(@F).cmd) |
| 86 | echo 'cmd_$@ := $(subst $$,$$$$,$(call escsq,$(cmd_$(1))))' > $(@D)/.$(@F).cmd) | ||
| 87 | 125 | ||
| 88 | # execute the command and also postprocess generated .d dependencies | 126 | # execute the command and also postprocess generated .d dependencies |
| 89 | # file | 127 | # file |
| 90 | if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^)\ | 128 | if_changed_dep = $(if $(strip $(filter-out $(PHONY),$?) \ |
| 91 | $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \ | 129 | $(filter-out FORCE $(wildcard $^),$^) \ |
| 130 | $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \ | ||
| 92 | @set -e; \ | 131 | @set -e; \ |
| 93 | $(echo-cmd) \ | 132 | $(echo-cmd) $(cmd_$(1)); \ |
| 94 | $(cmd_$(1)); \ | 133 | scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(@D)/.$(@F).tmp; \ |
| 95 | scripts/basic/fixdep $(depfile) $@ '$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))' > $(@D)/.$(@F).tmp; \ | ||
| 96 | rm -f $(depfile); \ | 134 | rm -f $(depfile); \ |
| 97 | mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd) | 135 | mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd) |
| 98 | 136 | ||
| 99 | # Usage: $(call if_changed_rule,foo) | 137 | # Usage: $(call if_changed_rule,foo) |
| 100 | # will check if $(cmd_foo) changed, or any of the prequisites changed, | 138 | # will check if $(cmd_foo) changed, or any of the prequisites changed, |
| 101 | # and if so will execute $(rule_foo) | 139 | # and if so will execute $(rule_foo) |
| 102 | if_changed_rule = $(if $(strip $? $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),\ | 140 | if_changed_rule = $(if $(strip $(filter-out $(PHONY),$?) \ |
| 141 | $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),\ | ||
| 103 | @set -e; \ | 142 | @set -e; \ |
| 104 | $(rule_$(1))) | 143 | $(rule_$(1))) |
diff --git a/scripts/Makefile.build b/scripts/Makefile.build index c33e62bde6b0..e48e60da3040 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build | |||
| @@ -4,17 +4,18 @@ | |||
| 4 | 4 | ||
| 5 | src := $(obj) | 5 | src := $(obj) |
| 6 | 6 | ||
| 7 | .PHONY: __build | 7 | PHONY := __build |
| 8 | __build: | 8 | __build: |
| 9 | 9 | ||
| 10 | # Read .config if it exist, otherwise ignore | 10 | # Read .config if it exist, otherwise ignore |
| 11 | -include .config | 11 | -include .config |
| 12 | 12 | ||
| 13 | include scripts/Kbuild.include | ||
| 14 | |||
| 13 | # The filename Kbuild has precedence over Makefile | 15 | # The filename Kbuild has precedence over Makefile |
| 14 | kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) | 16 | kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) |
| 15 | include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile) | 17 | include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile) |
| 16 | 18 | ||
| 17 | include scripts/Kbuild.include | ||
| 18 | include scripts/Makefile.lib | 19 | include scripts/Makefile.lib |
| 19 | 20 | ||
| 20 | ifdef host-progs | 21 | ifdef host-progs |
| @@ -128,7 +129,7 @@ $(multi-objs-y:.o=.s) : modname = $(modname-multi) | |||
| 128 | $(multi-objs-y:.o=.lst) : modname = $(modname-multi) | 129 | $(multi-objs-y:.o=.lst) : modname = $(modname-multi) |
| 129 | 130 | ||
| 130 | quiet_cmd_cc_s_c = CC $(quiet_modtag) $@ | 131 | quiet_cmd_cc_s_c = CC $(quiet_modtag) $@ |
| 131 | cmd_cc_s_c = $(CC) $(c_flags) -S -o $@ $< | 132 | cmd_cc_s_c = $(CC) $(c_flags) -fverbose-asm -S -o $@ $< |
| 132 | 133 | ||
| 133 | %.s: %.c FORCE | 134 | %.s: %.c FORCE |
| 134 | $(call if_changed_dep,cc_s_c) | 135 | $(call if_changed_dep,cc_s_c) |
| @@ -165,7 +166,7 @@ cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< | |||
| 165 | cmd_modversions = \ | 166 | cmd_modversions = \ |
| 166 | if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ | 167 | if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ |
| 167 | $(CPP) -D__GENKSYMS__ $(c_flags) $< \ | 168 | $(CPP) -D__GENKSYMS__ $(c_flags) $< \ |
| 168 | | $(GENKSYMS) \ | 169 | | $(GENKSYMS) -a $(ARCH) \ |
| 169 | > $(@D)/.tmp_$(@F:.o=.ver); \ | 170 | > $(@D)/.tmp_$(@F:.o=.ver); \ |
| 170 | \ | 171 | \ |
| 171 | $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ | 172 | $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ |
| @@ -177,12 +178,10 @@ cmd_modversions = \ | |||
| 177 | endif | 178 | endif |
| 178 | 179 | ||
| 179 | define rule_cc_o_c | 180 | define rule_cc_o_c |
| 180 | $(if $($(quiet)cmd_checksrc),echo ' $($(quiet)cmd_checksrc)';) \ | 181 | $(call echo-cmd,checksrc) $(cmd_checksrc) \ |
| 181 | $(cmd_checksrc) \ | 182 | $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \ |
| 182 | $(if $($(quiet)cmd_cc_o_c),echo ' $(call escsq,$($(quiet)cmd_cc_o_c))';) \ | ||
| 183 | $(cmd_cc_o_c); \ | ||
| 184 | $(cmd_modversions) \ | 183 | $(cmd_modversions) \ |
| 185 | scripts/basic/fixdep $(depfile) $@ '$(call escsq,$(cmd_cc_o_c))' > $(@D)/.$(@F).tmp; \ | 184 | scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > $(@D)/.$(@F).tmp; \ |
| 186 | rm -f $(depfile); \ | 185 | rm -f $(depfile); \ |
| 187 | mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd | 186 | mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd |
| 188 | endef | 187 | endef |
| @@ -309,14 +308,14 @@ targets += $(multi-used-y) $(multi-used-m) | |||
| 309 | # Descending | 308 | # Descending |
| 310 | # --------------------------------------------------------------------------- | 309 | # --------------------------------------------------------------------------- |
| 311 | 310 | ||
| 312 | .PHONY: $(subdir-ym) | 311 | PHONY += $(subdir-ym) |
| 313 | $(subdir-ym): | 312 | $(subdir-ym): |
| 314 | $(Q)$(MAKE) $(build)=$@ | 313 | $(Q)$(MAKE) $(build)=$@ |
| 315 | 314 | ||
| 316 | # Add FORCE to the prequisites of a target to force it to be always rebuilt. | 315 | # Add FORCE to the prequisites of a target to force it to be always rebuilt. |
| 317 | # --------------------------------------------------------------------------- | 316 | # --------------------------------------------------------------------------- |
| 318 | 317 | ||
| 319 | .PHONY: FORCE | 318 | PHONY += FORCE |
| 320 | 319 | ||
| 321 | FORCE: | 320 | FORCE: |
| 322 | 321 | ||
| @@ -331,3 +330,9 @@ cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) | |||
| 331 | ifneq ($(cmd_files),) | 330 | ifneq ($(cmd_files),) |
| 332 | include $(cmd_files) | 331 | include $(cmd_files) |
| 333 | endif | 332 | endif |
| 333 | |||
| 334 | |||
| 335 | # Declare the contents of the .PHONY variable as phony. We keep that | ||
| 336 | # information in a variable se we can use it in if_changed and friends. | ||
| 337 | |||
| 338 | .PHONY: $(PHONY) | ||
diff --git a/scripts/Makefile.clean b/scripts/Makefile.clean index 8974ea5fc878..cff33498fa16 100644 --- a/scripts/Makefile.clean +++ b/scripts/Makefile.clean | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | src := $(obj) | 5 | src := $(obj) |
| 6 | 6 | ||
| 7 | .PHONY: __clean | 7 | PHONY := __clean |
| 8 | __clean: | 8 | __clean: |
| 9 | 9 | ||
| 10 | # Shorthand for $(Q)$(MAKE) scripts/Makefile.clean obj=dir | 10 | # Shorthand for $(Q)$(MAKE) scripts/Makefile.clean obj=dir |
| @@ -87,10 +87,16 @@ endif | |||
| 87 | # Descending | 87 | # Descending |
| 88 | # --------------------------------------------------------------------------- | 88 | # --------------------------------------------------------------------------- |
| 89 | 89 | ||
| 90 | .PHONY: $(subdir-ymn) | 90 | PHONY += $(subdir-ymn) |
| 91 | $(subdir-ymn): | 91 | $(subdir-ymn): |
| 92 | $(Q)$(MAKE) $(clean)=$@ | 92 | $(Q)$(MAKE) $(clean)=$@ |
| 93 | 93 | ||
| 94 | # If quiet is set, only print short version of command | 94 | # If quiet is set, only print short version of command |
| 95 | 95 | ||
| 96 | cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1)) | 96 | cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1)) |
| 97 | |||
| 98 | |||
| 99 | # Declare the contents of the .PHONY variable as phony. We keep that | ||
| 100 | # information in a variable se we can use it in if_changed and friends. | ||
| 101 | |||
| 102 | .PHONY: $(PHONY) | ||
diff --git a/scripts/Makefile.modinst b/scripts/Makefile.modinst index 23fd1bdc25ce..2686dd5dce8c 100644 --- a/scripts/Makefile.modinst +++ b/scripts/Makefile.modinst | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | # Installing modules | 2 | # Installing modules |
| 3 | # ========================================================================== | 3 | # ========================================================================== |
| 4 | 4 | ||
| 5 | .PHONY: __modinst | 5 | PHONY := __modinst |
| 6 | __modinst: | 6 | __modinst: |
| 7 | 7 | ||
| 8 | include scripts/Kbuild.include | 8 | include scripts/Kbuild.include |
| @@ -12,7 +12,7 @@ include scripts/Kbuild.include | |||
| 12 | __modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod))) | 12 | __modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod))) |
| 13 | modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o))) | 13 | modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o))) |
| 14 | 14 | ||
| 15 | .PHONY: $(modules) | 15 | PHONY += $(modules) |
| 16 | __modinst: $(modules) | 16 | __modinst: $(modules) |
| 17 | @: | 17 | @: |
| 18 | 18 | ||
| @@ -27,3 +27,9 @@ modinst_dir = $(if $(KBUILD_EXTMOD),$(ext-mod-dir),kernel/$(@D)) | |||
| 27 | 27 | ||
| 28 | $(modules): | 28 | $(modules): |
| 29 | $(call cmd,modules_install,$(MODLIB)/$(modinst_dir)) | 29 | $(call cmd,modules_install,$(MODLIB)/$(modinst_dir)) |
| 30 | |||
| 31 | |||
| 32 | # Declare the contents of the .PHONY variable as phony. We keep that | ||
| 33 | # information in a variable se we can use it in if_changed and friends. | ||
| 34 | |||
| 35 | .PHONY: $(PHONY) | ||
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index 9a3ec20b0be2..0e056cffffdb 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost | |||
| @@ -32,14 +32,15 @@ | |||
| 32 | # Step 4 is solely used to allow module versioning in external modules, | 32 | # Step 4 is solely used to allow module versioning in external modules, |
| 33 | # where the CRC of each module is retrieved from the Module.symers file. | 33 | # where the CRC of each module is retrieved from the Module.symers file. |
| 34 | 34 | ||
| 35 | .PHONY: _modpost | 35 | PHONY := _modpost |
| 36 | _modpost: __modpost | 36 | _modpost: __modpost |
| 37 | 37 | ||
| 38 | include .config | 38 | include .config |
| 39 | include scripts/Kbuild.include | 39 | include scripts/Kbuild.include |
| 40 | include scripts/Makefile.lib | 40 | include scripts/Makefile.lib |
| 41 | 41 | ||
| 42 | symverfile := $(objtree)/Module.symvers | 42 | kernelsymfile := $(objtree)/Module.symvers |
| 43 | modulesymfile := $(KBUILD_EXTMOD)/Modules.symvers | ||
| 43 | 44 | ||
| 44 | # Step 1), find all modules listed in $(MODVERDIR)/ | 45 | # Step 1), find all modules listed in $(MODVERDIR)/ |
| 45 | __modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod))) | 46 | __modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod))) |
| @@ -54,10 +55,12 @@ quiet_cmd_modpost = MODPOST | |||
| 54 | cmd_modpost = scripts/mod/modpost \ | 55 | cmd_modpost = scripts/mod/modpost \ |
| 55 | $(if $(CONFIG_MODVERSIONS),-m) \ | 56 | $(if $(CONFIG_MODVERSIONS),-m) \ |
| 56 | $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a,) \ | 57 | $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a,) \ |
| 57 | $(if $(KBUILD_EXTMOD),-i,-o) $(symverfile) \ | 58 | $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \ |
| 59 | $(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \ | ||
| 60 | $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ | ||
| 58 | $(filter-out FORCE,$^) | 61 | $(filter-out FORCE,$^) |
| 59 | 62 | ||
| 60 | .PHONY: __modpost | 63 | PHONY += __modpost |
| 61 | __modpost: $(wildcard vmlinux) $(modules:.ko=.o) FORCE | 64 | __modpost: $(wildcard vmlinux) $(modules:.ko=.o) FORCE |
| 62 | $(call cmd,modpost) | 65 | $(call cmd,modpost) |
| 63 | 66 | ||
| @@ -94,7 +97,7 @@ targets += $(modules) | |||
| 94 | # Add FORCE to the prequisites of a target to force it to be always rebuilt. | 97 | # Add FORCE to the prequisites of a target to force it to be always rebuilt. |
| 95 | # --------------------------------------------------------------------------- | 98 | # --------------------------------------------------------------------------- |
| 96 | 99 | ||
| 97 | .PHONY: FORCE | 100 | PHONY += FORCE |
| 98 | 101 | ||
| 99 | FORCE: | 102 | FORCE: |
| 100 | 103 | ||
| @@ -109,3 +112,9 @@ cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) | |||
| 109 | ifneq ($(cmd_files),) | 112 | ifneq ($(cmd_files),) |
| 110 | include $(cmd_files) | 113 | include $(cmd_files) |
| 111 | endif | 114 | endif |
| 115 | |||
| 116 | |||
| 117 | # Declare the contents of the .PHONY variable as phony. We keep that | ||
| 118 | # information in a variable se we can use it in if_changed and friends. | ||
| 119 | |||
| 120 | .PHONY: $(PHONY) | ||
diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c index 679124b11e12..668a11a8b383 100644 --- a/scripts/basic/fixdep.c +++ b/scripts/basic/fixdep.c | |||
| @@ -132,20 +132,10 @@ void usage(void) | |||
| 132 | 132 | ||
| 133 | /* | 133 | /* |
| 134 | * Print out the commandline prefixed with cmd_<target filename> := | 134 | * Print out the commandline prefixed with cmd_<target filename> := |
| 135 | * If commandline contains '#' escape with '\' so make to not see | 135 | */ |
| 136 | * the '#' as a start-of-comment symbol | ||
| 137 | **/ | ||
| 138 | void print_cmdline(void) | 136 | void print_cmdline(void) |
| 139 | { | 137 | { |
| 140 | char *p = cmdline; | 138 | printf("cmd_%s := %s\n\n", target, cmdline); |
| 141 | |||
| 142 | printf("cmd_%s := ", target); | ||
| 143 | for (; *p; p++) { | ||
| 144 | if (*p == '#') | ||
| 145 | printf("\\"); | ||
| 146 | printf("%c", *p); | ||
| 147 | } | ||
| 148 | printf("\n\n"); | ||
| 149 | } | 139 | } |
| 150 | 140 | ||
| 151 | char * str_config = NULL; | 141 | char * str_config = NULL; |
diff --git a/scripts/checkconfig.pl b/scripts/checkconfig.pl deleted file mode 100755 index ca1f231b15a6..000000000000 --- a/scripts/checkconfig.pl +++ /dev/null | |||
| @@ -1,65 +0,0 @@ | |||
| 1 | #! /usr/bin/perl | ||
| 2 | # | ||
| 3 | # checkconfig: find uses of CONFIG_* names without matching definitions. | ||
| 4 | # Copyright abandoned, 1998, Michael Elizabeth Chastain <mailto:mec@shout.net>. | ||
| 5 | |||
| 6 | use integer; | ||
| 7 | |||
| 8 | $| = 1; | ||
| 9 | |||
| 10 | foreach $file (@ARGV) | ||
| 11 | { | ||
| 12 | # Open this file. | ||
| 13 | open(FILE, $file) || die "Can't open $file: $!\n"; | ||
| 14 | |||
| 15 | # Initialize variables. | ||
| 16 | my $fInComment = 0; | ||
| 17 | my $fInString = 0; | ||
| 18 | my $fUseConfig = 0; | ||
| 19 | my $iLinuxConfig = 0; | ||
| 20 | my %configList = (); | ||
| 21 | |||
| 22 | LINE: while ( <FILE> ) | ||
| 23 | { | ||
| 24 | # Strip comments. | ||
| 25 | $fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next); | ||
| 26 | m+/\*+o && (s+/\*.*?\*/+ +go, (s+/\*.*$+ +o && ($fInComment = 1))); | ||
| 27 | |||
| 28 | # Pick up definitions. | ||
| 29 | if ( m/^\s*#/o ) | ||
| 30 | { | ||
| 31 | $iLinuxConfig = $. if m/^\s*#\s*include\s*"linux\/config\.h"/o; | ||
| 32 | $configList{uc $1} = 1 if m/^\s*#\s*include\s*"config\/(\S*)\.h"/o; | ||
| 33 | } | ||
| 34 | |||
| 35 | # Strip strings. | ||
| 36 | $fInString && (s+^.*?"+ +o ? ($fInString = 0) : next); | ||
| 37 | m+"+o && (s+".*?"+ +go, (s+".*$+ +o && ($fInString = 1))); | ||
| 38 | |||
| 39 | # Pick up definitions. | ||
| 40 | if ( m/^\s*#/o ) | ||
| 41 | { | ||
| 42 | $iLinuxConfig = $. if m/^\s*#\s*include\s*<linux\/config\.h>/o; | ||
| 43 | $configList{uc $1} = 1 if m/^\s*#\s*include\s*<config\/(\S*)\.h>/o; | ||
| 44 | $configList{$1} = 1 if m/^\s*#\s*define\s+CONFIG_(\w*)/o; | ||
| 45 | $configList{$1} = 1 if m/^\s*#\s*undef\s+CONFIG_(\w*)/o; | ||
| 46 | } | ||
| 47 | |||
| 48 | # Look for usages. | ||
| 49 | next unless m/CONFIG_/o; | ||
| 50 | WORD: while ( m/\bCONFIG_(\w+)/og ) | ||
| 51 | { | ||
| 52 | $fUseConfig = 1; | ||
| 53 | last LINE if $iLinuxConfig; | ||
| 54 | next WORD if exists $configList{$1}; | ||
| 55 | print "$file: $.: need CONFIG_$1.\n"; | ||
| 56 | $configList{$1} = 0; | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | # Report superfluous includes. | ||
| 61 | if ( $iLinuxConfig && ! $fUseConfig ) | ||
| 62 | { print "$file: $iLinuxConfig: linux/config.h not needed.\n"; } | ||
| 63 | |||
| 64 | close(FILE); | ||
| 65 | } | ||
diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c index 416a694b0998..5b0344e20d61 100644 --- a/scripts/genksyms/genksyms.c +++ b/scripts/genksyms/genksyms.c | |||
| @@ -29,481 +29,421 @@ | |||
| 29 | #include <stdarg.h> | 29 | #include <stdarg.h> |
| 30 | #ifdef __GNU_LIBRARY__ | 30 | #ifdef __GNU_LIBRARY__ |
| 31 | #include <getopt.h> | 31 | #include <getopt.h> |
| 32 | #endif /* __GNU_LIBRARY__ */ | 32 | #endif /* __GNU_LIBRARY__ */ |
| 33 | 33 | ||
| 34 | #include "genksyms.h" | 34 | #include "genksyms.h" |
| 35 | |||
| 36 | /*----------------------------------------------------------------------*/ | 35 | /*----------------------------------------------------------------------*/ |
| 37 | 36 | ||
| 38 | #define HASH_BUCKETS 4096 | 37 | #define HASH_BUCKETS 4096 |
| 39 | 38 | ||
| 40 | static struct symbol *symtab[HASH_BUCKETS]; | 39 | static struct symbol *symtab[HASH_BUCKETS]; |
| 41 | FILE *debugfile; | 40 | static FILE *debugfile; |
| 42 | 41 | ||
| 43 | int cur_line = 1; | 42 | int cur_line = 1; |
| 44 | char *cur_filename, *output_directory; | 43 | char *cur_filename; |
| 45 | 44 | ||
| 46 | int flag_debug, flag_dump_defs, flag_warnings; | 45 | static int flag_debug, flag_dump_defs, flag_warnings; |
| 46 | static const char *arch = ""; | ||
| 47 | static const char *mod_prefix = ""; | ||
| 47 | 48 | ||
| 48 | static int errors; | 49 | static int errors; |
| 49 | static int nsyms; | 50 | static int nsyms; |
| 50 | 51 | ||
| 51 | static struct symbol *expansion_trail; | 52 | static struct symbol *expansion_trail; |
| 52 | 53 | ||
| 53 | static const char * const symbol_type_name[] = { | 54 | static const char *const symbol_type_name[] = { |
| 54 | "normal", "typedef", "enum", "struct", "union" | 55 | "normal", "typedef", "enum", "struct", "union" |
| 55 | }; | 56 | }; |
| 56 | 57 | ||
| 58 | static int equal_list(struct string_list *a, struct string_list *b); | ||
| 59 | static void print_list(FILE * f, struct string_list *list); | ||
| 60 | |||
| 57 | /*----------------------------------------------------------------------*/ | 61 | /*----------------------------------------------------------------------*/ |
| 58 | 62 | ||
| 59 | static const unsigned int crctab32[] = | 63 | static const unsigned int crctab32[] = { |
| 60 | { | 64 | 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U, |
| 61 | 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U, | 65 | 0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U, |
| 62 | 0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U, | 66 | 0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U, |
| 63 | 0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U, | 67 | 0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU, |
| 64 | 0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU, | 68 | 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U, |
| 65 | 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U, | 69 | 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U, |
| 66 | 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U, | 70 | 0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U, |
| 67 | 0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U, | 71 | 0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU, |
| 68 | 0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU, | 72 | 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U, |
| 69 | 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U, | 73 | 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU, |
| 70 | 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU, | 74 | 0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U, |
| 71 | 0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U, | 75 | 0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U, |
| 72 | 0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U, | 76 | 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U, |
| 73 | 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U, | 77 | 0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU, |
| 74 | 0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU, | 78 | 0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU, |
| 75 | 0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU, | 79 | 0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U, |
| 76 | 0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U, | 80 | 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU, |
| 77 | 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU, | 81 | 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U, |
| 78 | 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U, | 82 | 0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U, |
| 79 | 0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U, | 83 | 0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U, |
| 80 | 0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U, | 84 | 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU, |
| 81 | 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU, | 85 | 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U, |
| 82 | 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U, | 86 | 0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U, |
| 83 | 0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U, | 87 | 0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU, |
| 84 | 0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU, | 88 | 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U, |
| 85 | 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U, | 89 | 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U, |
| 86 | 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U, | 90 | 0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U, |
| 87 | 0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U, | 91 | 0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U, |
| 88 | 0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U, | 92 | 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U, |
| 89 | 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U, | 93 | 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU, |
| 90 | 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU, | 94 | 0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU, |
| 91 | 0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU, | 95 | 0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U, |
| 92 | 0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U, | 96 | 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U, |
| 93 | 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U, | 97 | 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU, |
| 94 | 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU, | 98 | 0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU, |
| 95 | 0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU, | 99 | 0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U, |
| 96 | 0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U, | 100 | 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU, |
| 97 | 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU, | 101 | 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U, |
| 98 | 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U, | 102 | 0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU, |
| 99 | 0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU, | 103 | 0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U, |
| 100 | 0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U, | 104 | 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU, |
| 101 | 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU, | 105 | 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U, |
| 102 | 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U, | 106 | 0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U, |
| 103 | 0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U, | 107 | 0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU, |
| 104 | 0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU, | 108 | 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U, |
| 105 | 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U, | 109 | 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U, |
| 106 | 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U, | 110 | 0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U, |
| 107 | 0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U, | 111 | 0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U, |
| 108 | 0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U, | 112 | 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U, |
| 109 | 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U, | 113 | 0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U, |
| 110 | 0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U, | 114 | 0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU, |
| 111 | 0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU, | 115 | 0x2d02ef8dU |
| 112 | 0x2d02ef8dU | ||
| 113 | }; | 116 | }; |
| 114 | 117 | ||
| 115 | static inline unsigned long | 118 | static unsigned long partial_crc32_one(unsigned char c, unsigned long crc) |
| 116 | partial_crc32_one(unsigned char c, unsigned long crc) | ||
| 117 | { | 119 | { |
| 118 | return crctab32[(crc ^ c) & 0xff] ^ (crc >> 8); | 120 | return crctab32[(crc ^ c) & 0xff] ^ (crc >> 8); |
| 119 | } | 121 | } |
| 120 | 122 | ||
| 121 | static inline unsigned long | 123 | static unsigned long partial_crc32(const char *s, unsigned long crc) |
| 122 | partial_crc32(const char *s, unsigned long crc) | ||
| 123 | { | 124 | { |
| 124 | while (*s) | 125 | while (*s) |
| 125 | crc = partial_crc32_one(*s++, crc); | 126 | crc = partial_crc32_one(*s++, crc); |
| 126 | return crc; | 127 | return crc; |
| 127 | } | 128 | } |
| 128 | 129 | ||
| 129 | static inline unsigned long | 130 | static unsigned long crc32(const char *s) |
| 130 | crc32(const char *s) | ||
| 131 | { | 131 | { |
| 132 | return partial_crc32(s, 0xffffffff) ^ 0xffffffff; | 132 | return partial_crc32(s, 0xffffffff) ^ 0xffffffff; |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | |||
| 136 | /*----------------------------------------------------------------------*/ | 135 | /*----------------------------------------------------------------------*/ |
| 137 | 136 | ||
| 138 | static inline enum symbol_type | 137 | static enum symbol_type map_to_ns(enum symbol_type t) |
| 139 | map_to_ns(enum symbol_type t) | ||
| 140 | { | 138 | { |
| 141 | if (t == SYM_TYPEDEF) | 139 | if (t == SYM_TYPEDEF) |
| 142 | t = SYM_NORMAL; | 140 | t = SYM_NORMAL; |
| 143 | else if (t == SYM_UNION) | 141 | else if (t == SYM_UNION) |
| 144 | t = SYM_STRUCT; | 142 | t = SYM_STRUCT; |
| 145 | return t; | 143 | return t; |
| 146 | } | 144 | } |
| 147 | 145 | ||
| 148 | struct symbol * | 146 | struct symbol *find_symbol(const char *name, enum symbol_type ns) |
| 149 | find_symbol(const char *name, enum symbol_type ns) | ||
| 150 | { | 147 | { |
| 151 | unsigned long h = crc32(name) % HASH_BUCKETS; | 148 | unsigned long h = crc32(name) % HASH_BUCKETS; |
| 152 | struct symbol *sym; | 149 | struct symbol *sym; |
| 153 | 150 | ||
| 154 | for (sym = symtab[h]; sym ; sym = sym->hash_next) | 151 | for (sym = symtab[h]; sym; sym = sym->hash_next) |
| 155 | if (map_to_ns(sym->type) == map_to_ns(ns) && strcmp(name, sym->name) == 0) | 152 | if (map_to_ns(sym->type) == map_to_ns(ns) && |
| 156 | break; | 153 | strcmp(name, sym->name) == 0) |
| 154 | break; | ||
| 157 | 155 | ||
| 158 | return sym; | 156 | return sym; |
| 159 | } | 157 | } |
| 160 | 158 | ||
| 161 | struct symbol * | 159 | struct symbol *add_symbol(const char *name, enum symbol_type type, |
| 162 | add_symbol(const char *name, enum symbol_type type, struct string_list *defn, int is_extern) | 160 | struct string_list *defn, int is_extern) |
| 163 | { | 161 | { |
| 164 | unsigned long h = crc32(name) % HASH_BUCKETS; | 162 | unsigned long h = crc32(name) % HASH_BUCKETS; |
| 165 | struct symbol *sym; | 163 | struct symbol *sym; |
| 166 | 164 | ||
| 167 | for (sym = symtab[h]; sym ; sym = sym->hash_next) | 165 | for (sym = symtab[h]; sym; sym = sym->hash_next) { |
| 168 | if (map_to_ns(sym->type) == map_to_ns(type) | 166 | if (map_to_ns(sym->type) == map_to_ns(type) |
| 169 | && strcmp(name, sym->name) == 0) | 167 | && strcmp(name, sym->name) == 0) { |
| 170 | { | 168 | if (!equal_list(sym->defn, defn)) |
| 171 | if (!equal_list(sym->defn, defn)) | 169 | error_with_pos("redefinition of %s", name); |
| 172 | error_with_pos("redefinition of %s", name); | 170 | return sym; |
| 171 | } | ||
| 172 | } | ||
| 173 | |||
| 174 | sym = xmalloc(sizeof(*sym)); | ||
| 175 | sym->name = name; | ||
| 176 | sym->type = type; | ||
| 177 | sym->defn = defn; | ||
| 178 | sym->expansion_trail = NULL; | ||
| 179 | sym->is_extern = is_extern; | ||
| 180 | |||
| 181 | sym->hash_next = symtab[h]; | ||
| 182 | symtab[h] = sym; | ||
| 183 | |||
| 184 | if (flag_debug) { | ||
| 185 | fprintf(debugfile, "Defn for %s %s == <", | ||
| 186 | symbol_type_name[type], name); | ||
| 187 | if (is_extern) | ||
| 188 | fputs("extern ", debugfile); | ||
| 189 | print_list(debugfile, defn); | ||
| 190 | fputs(">\n", debugfile); | ||
| 191 | } | ||
| 192 | |||
| 193 | ++nsyms; | ||
| 173 | return sym; | 194 | return sym; |
| 174 | } | ||
| 175 | |||
| 176 | sym = xmalloc(sizeof(*sym)); | ||
| 177 | sym->name = name; | ||
| 178 | sym->type = type; | ||
| 179 | sym->defn = defn; | ||
| 180 | sym->expansion_trail = NULL; | ||
| 181 | sym->is_extern = is_extern; | ||
| 182 | |||
| 183 | sym->hash_next = symtab[h]; | ||
| 184 | symtab[h] = sym; | ||
| 185 | |||
| 186 | if (flag_debug) | ||
| 187 | { | ||
| 188 | fprintf(debugfile, "Defn for %s %s == <", symbol_type_name[type], name); | ||
| 189 | if (is_extern) | ||
| 190 | fputs("extern ", debugfile); | ||
| 191 | print_list(debugfile, defn); | ||
| 192 | fputs(">\n", debugfile); | ||
| 193 | } | ||
| 194 | |||
| 195 | ++nsyms; | ||
| 196 | return sym; | ||
| 197 | } | 195 | } |
| 198 | 196 | ||
| 199 | |||
| 200 | /*----------------------------------------------------------------------*/ | 197 | /*----------------------------------------------------------------------*/ |
| 201 | 198 | ||
| 202 | inline void | 199 | void free_node(struct string_list *node) |
| 203 | free_node(struct string_list *node) | ||
| 204 | { | 200 | { |
| 205 | free(node->string); | 201 | free(node->string); |
| 206 | free(node); | 202 | free(node); |
| 207 | } | 203 | } |
| 208 | 204 | ||
| 209 | void | 205 | void free_list(struct string_list *s, struct string_list *e) |
| 210 | free_list(struct string_list *s, struct string_list *e) | ||
| 211 | { | 206 | { |
| 212 | while (s != e) | 207 | while (s != e) { |
| 213 | { | 208 | struct string_list *next = s->next; |
| 214 | struct string_list *next = s->next; | 209 | free_node(s); |
| 215 | free_node(s); | 210 | s = next; |
| 216 | s = next; | 211 | } |
| 217 | } | ||
| 218 | } | 212 | } |
| 219 | 213 | ||
| 220 | inline struct string_list * | 214 | struct string_list *copy_node(struct string_list *node) |
| 221 | copy_node(struct string_list *node) | ||
| 222 | { | 215 | { |
| 223 | struct string_list *newnode; | 216 | struct string_list *newnode; |
| 224 | 217 | ||
| 225 | newnode = xmalloc(sizeof(*newnode)); | 218 | newnode = xmalloc(sizeof(*newnode)); |
| 226 | newnode->string = xstrdup(node->string); | 219 | newnode->string = xstrdup(node->string); |
| 227 | newnode->tag = node->tag; | 220 | newnode->tag = node->tag; |
| 228 | 221 | ||
| 229 | return newnode; | 222 | return newnode; |
| 230 | } | 223 | } |
| 231 | 224 | ||
| 232 | struct string_list * | 225 | static int equal_list(struct string_list *a, struct string_list *b) |
| 233 | copy_list(struct string_list *s, struct string_list *e) | ||
| 234 | { | 226 | { |
| 235 | struct string_list *h, *p; | 227 | while (a && b) { |
| 236 | 228 | if (a->tag != b->tag || strcmp(a->string, b->string)) | |
| 237 | if (s == e) | 229 | return 0; |
| 238 | return NULL; | 230 | a = a->next; |
| 239 | 231 | b = b->next; | |
| 240 | p = h = copy_node(s); | 232 | } |
| 241 | while ((s = s->next) != e) | ||
| 242 | p = p->next = copy_node(s); | ||
| 243 | p->next = NULL; | ||
| 244 | |||
| 245 | return h; | ||
| 246 | } | ||
| 247 | 233 | ||
| 248 | int | 234 | return !a && !b; |
| 249 | equal_list(struct string_list *a, struct string_list *b) | ||
| 250 | { | ||
| 251 | while (a && b) | ||
| 252 | { | ||
| 253 | if (a->tag != b->tag || strcmp(a->string, b->string)) | ||
| 254 | return 0; | ||
| 255 | a = a->next; | ||
| 256 | b = b->next; | ||
| 257 | } | ||
| 258 | |||
| 259 | return !a && !b; | ||
| 260 | } | 235 | } |
| 261 | 236 | ||
| 262 | static inline void | 237 | static void print_node(FILE * f, struct string_list *list) |
| 263 | print_node(FILE *f, struct string_list *list) | ||
| 264 | { | 238 | { |
| 265 | switch (list->tag) | 239 | switch (list->tag) { |
| 266 | { | 240 | case SYM_STRUCT: |
| 267 | case SYM_STRUCT: | 241 | putc('s', f); |
| 268 | putc('s', f); | 242 | goto printit; |
| 269 | goto printit; | 243 | case SYM_UNION: |
| 270 | case SYM_UNION: | 244 | putc('u', f); |
| 271 | putc('u', f); | 245 | goto printit; |
| 272 | goto printit; | 246 | case SYM_ENUM: |
| 273 | case SYM_ENUM: | 247 | putc('e', f); |
| 274 | putc('e', f); | 248 | goto printit; |
| 275 | goto printit; | 249 | case SYM_TYPEDEF: |
| 276 | case SYM_TYPEDEF: | 250 | putc('t', f); |
| 277 | putc('t', f); | 251 | goto printit; |
| 278 | goto printit; | ||
| 279 | |||
| 280 | printit: | ||
| 281 | putc('#', f); | ||
| 282 | case SYM_NORMAL: | ||
| 283 | fputs(list->string, f); | ||
| 284 | break; | ||
| 285 | } | ||
| 286 | } | ||
| 287 | 252 | ||
| 288 | void | 253 | printit: |
| 289 | print_list(FILE *f, struct string_list *list) | 254 | putc('#', f); |
| 290 | { | 255 | case SYM_NORMAL: |
| 291 | struct string_list **e, **b; | 256 | fputs(list->string, f); |
| 292 | struct string_list *tmp, **tmp2; | 257 | break; |
| 293 | int elem = 1; | 258 | } |
| 294 | |||
| 295 | if (list == NULL) | ||
| 296 | { | ||
| 297 | fputs("(nil)", f); | ||
| 298 | return; | ||
| 299 | } | ||
| 300 | |||
| 301 | tmp = list; | ||
| 302 | while((tmp = tmp->next) != NULL) | ||
| 303 | elem++; | ||
| 304 | |||
| 305 | b = alloca(elem * sizeof(*e)); | ||
| 306 | e = b + elem; | ||
| 307 | tmp2 = e - 1; | ||
| 308 | |||
| 309 | (*tmp2--) = list; | ||
| 310 | while((list = list->next) != NULL) | ||
| 311 | *(tmp2--) = list; | ||
| 312 | |||
| 313 | while (b != e) | ||
| 314 | { | ||
| 315 | print_node(f, *b++); | ||
| 316 | putc(' ', f); | ||
| 317 | } | ||
| 318 | } | 259 | } |
| 319 | 260 | ||
| 320 | static unsigned long | 261 | static void print_list(FILE * f, struct string_list *list) |
| 321 | expand_and_crc_list(struct string_list *list, unsigned long crc) | ||
| 322 | { | 262 | { |
| 323 | struct string_list **e, **b; | 263 | struct string_list **e, **b; |
| 324 | struct string_list *tmp, **tmp2; | 264 | struct string_list *tmp, **tmp2; |
| 325 | int elem = 1; | 265 | int elem = 1; |
| 326 | |||
| 327 | if (!list) | ||
| 328 | return crc; | ||
| 329 | 266 | ||
| 330 | tmp = list; | 267 | if (list == NULL) { |
| 331 | while((tmp = tmp->next) != NULL) | 268 | fputs("(nil)", f); |
| 332 | elem++; | 269 | return; |
| 333 | 270 | } | |
| 334 | b = alloca(elem * sizeof(*e)); | ||
| 335 | e = b + elem; | ||
| 336 | tmp2 = e - 1; | ||
| 337 | 271 | ||
| 338 | *(tmp2--) = list; | 272 | tmp = list; |
| 339 | while ((list = list->next) != NULL) | 273 | while ((tmp = tmp->next) != NULL) |
| 340 | *(tmp2--) = list; | 274 | elem++; |
| 341 | 275 | ||
| 342 | while (b != e) | 276 | b = alloca(elem * sizeof(*e)); |
| 343 | { | 277 | e = b + elem; |
| 344 | struct string_list *cur; | 278 | tmp2 = e - 1; |
| 345 | struct symbol *subsym; | ||
| 346 | 279 | ||
| 347 | cur = *(b++); | 280 | (*tmp2--) = list; |
| 348 | switch (cur->tag) | 281 | while ((list = list->next) != NULL) |
| 349 | { | 282 | *(tmp2--) = list; |
| 350 | case SYM_NORMAL: | ||
| 351 | if (flag_dump_defs) | ||
| 352 | fprintf(debugfile, "%s ", cur->string); | ||
| 353 | crc = partial_crc32(cur->string, crc); | ||
| 354 | crc = partial_crc32_one(' ', crc); | ||
| 355 | break; | ||
| 356 | 283 | ||
| 357 | case SYM_TYPEDEF: | 284 | while (b != e) { |
| 358 | subsym = find_symbol(cur->string, cur->tag); | 285 | print_node(f, *b++); |
| 359 | if (subsym->expansion_trail) | 286 | putc(' ', f); |
| 360 | { | 287 | } |
| 361 | if (flag_dump_defs) | 288 | } |
| 362 | fprintf(debugfile, "%s ", cur->string); | ||
| 363 | crc = partial_crc32(cur->string, crc); | ||
| 364 | crc = partial_crc32_one(' ', crc); | ||
| 365 | } | ||
| 366 | else | ||
| 367 | { | ||
| 368 | subsym->expansion_trail = expansion_trail; | ||
| 369 | expansion_trail = subsym; | ||
| 370 | crc = expand_and_crc_list(subsym->defn, crc); | ||
| 371 | } | ||
| 372 | break; | ||
| 373 | 289 | ||
| 374 | case SYM_STRUCT: | 290 | static unsigned long expand_and_crc_list(struct string_list *list, |
| 375 | case SYM_UNION: | 291 | unsigned long crc) |
| 376 | case SYM_ENUM: | 292 | { |
| 377 | subsym = find_symbol(cur->string, cur->tag); | 293 | struct string_list **e, **b; |
| 378 | if (!subsym) | 294 | struct string_list *tmp, **tmp2; |
| 379 | { | 295 | int elem = 1; |
| 380 | struct string_list *n, *t = NULL; | 296 | |
| 381 | 297 | if (!list) | |
| 382 | error_with_pos("expand undefined %s %s", | 298 | return crc; |
| 383 | symbol_type_name[cur->tag], cur->string); | 299 | |
| 384 | 300 | tmp = list; | |
| 385 | n = xmalloc(sizeof(*n)); | 301 | while ((tmp = tmp->next) != NULL) |
| 386 | n->string = xstrdup(symbol_type_name[cur->tag]); | 302 | elem++; |
| 387 | n->tag = SYM_NORMAL; | 303 | |
| 388 | n->next = t; | 304 | b = alloca(elem * sizeof(*e)); |
| 389 | t = n; | 305 | e = b + elem; |
| 390 | 306 | tmp2 = e - 1; | |
| 391 | n = xmalloc(sizeof(*n)); | 307 | |
| 392 | n->string = xstrdup(cur->string); | 308 | *(tmp2--) = list; |
| 393 | n->tag = SYM_NORMAL; | 309 | while ((list = list->next) != NULL) |
| 394 | n->next = t; | 310 | *(tmp2--) = list; |
| 395 | t = n; | 311 | |
| 396 | 312 | while (b != e) { | |
| 397 | n = xmalloc(sizeof(*n)); | 313 | struct string_list *cur; |
| 398 | n->string = xstrdup("{ UNKNOWN }"); | 314 | struct symbol *subsym; |
| 399 | n->tag = SYM_NORMAL; | 315 | |
| 400 | n->next = t; | 316 | cur = *(b++); |
| 401 | 317 | switch (cur->tag) { | |
| 402 | subsym = add_symbol(cur->string, cur->tag, n, 0); | 318 | case SYM_NORMAL: |
| 403 | } | 319 | if (flag_dump_defs) |
| 404 | if (subsym->expansion_trail) | 320 | fprintf(debugfile, "%s ", cur->string); |
| 405 | { | 321 | crc = partial_crc32(cur->string, crc); |
| 406 | if (flag_dump_defs) | 322 | crc = partial_crc32_one(' ', crc); |
| 407 | { | 323 | break; |
| 408 | fprintf(debugfile, "%s %s ", symbol_type_name[cur->tag], | 324 | |
| 409 | cur->string); | 325 | case SYM_TYPEDEF: |
| 326 | subsym = find_symbol(cur->string, cur->tag); | ||
| 327 | if (subsym->expansion_trail) { | ||
| 328 | if (flag_dump_defs) | ||
| 329 | fprintf(debugfile, "%s ", cur->string); | ||
| 330 | crc = partial_crc32(cur->string, crc); | ||
| 331 | crc = partial_crc32_one(' ', crc); | ||
| 332 | } else { | ||
| 333 | subsym->expansion_trail = expansion_trail; | ||
| 334 | expansion_trail = subsym; | ||
| 335 | crc = expand_and_crc_list(subsym->defn, crc); | ||
| 336 | } | ||
| 337 | break; | ||
| 338 | |||
| 339 | case SYM_STRUCT: | ||
| 340 | case SYM_UNION: | ||
| 341 | case SYM_ENUM: | ||
| 342 | subsym = find_symbol(cur->string, cur->tag); | ||
| 343 | if (!subsym) { | ||
| 344 | struct string_list *n, *t = NULL; | ||
| 345 | |||
| 346 | error_with_pos("expand undefined %s %s", | ||
| 347 | symbol_type_name[cur->tag], | ||
| 348 | cur->string); | ||
| 349 | |||
| 350 | n = xmalloc(sizeof(*n)); | ||
| 351 | n->string = xstrdup(symbol_type_name[cur->tag]); | ||
| 352 | n->tag = SYM_NORMAL; | ||
| 353 | n->next = t; | ||
| 354 | t = n; | ||
| 355 | |||
| 356 | n = xmalloc(sizeof(*n)); | ||
| 357 | n->string = xstrdup(cur->string); | ||
| 358 | n->tag = SYM_NORMAL; | ||
| 359 | n->next = t; | ||
| 360 | t = n; | ||
| 361 | |||
| 362 | n = xmalloc(sizeof(*n)); | ||
| 363 | n->string = xstrdup("{ UNKNOWN }"); | ||
| 364 | n->tag = SYM_NORMAL; | ||
| 365 | n->next = t; | ||
| 366 | |||
| 367 | subsym = | ||
| 368 | add_symbol(cur->string, cur->tag, n, 0); | ||
| 369 | } | ||
| 370 | if (subsym->expansion_trail) { | ||
| 371 | if (flag_dump_defs) { | ||
| 372 | fprintf(debugfile, "%s %s ", | ||
| 373 | symbol_type_name[cur->tag], | ||
| 374 | cur->string); | ||
| 375 | } | ||
| 376 | |||
| 377 | crc = partial_crc32(symbol_type_name[cur->tag], | ||
| 378 | crc); | ||
| 379 | crc = partial_crc32_one(' ', crc); | ||
| 380 | crc = partial_crc32(cur->string, crc); | ||
| 381 | crc = partial_crc32_one(' ', crc); | ||
| 382 | } else { | ||
| 383 | subsym->expansion_trail = expansion_trail; | ||
| 384 | expansion_trail = subsym; | ||
| 385 | crc = expand_and_crc_list(subsym->defn, crc); | ||
| 386 | } | ||
| 387 | break; | ||
| 410 | } | 388 | } |
| 411 | |||
| 412 | crc = partial_crc32(symbol_type_name[cur->tag], crc); | ||
| 413 | crc = partial_crc32_one(' ', crc); | ||
| 414 | crc = partial_crc32(cur->string, crc); | ||
| 415 | crc = partial_crc32_one(' ', crc); | ||
| 416 | } | ||
| 417 | else | ||
| 418 | { | ||
| 419 | subsym->expansion_trail = expansion_trail; | ||
| 420 | expansion_trail = subsym; | ||
| 421 | crc = expand_and_crc_list(subsym->defn, crc); | ||
| 422 | } | ||
| 423 | break; | ||
| 424 | } | 389 | } |
| 425 | } | ||
| 426 | 390 | ||
| 427 | return crc; | 391 | return crc; |
| 428 | } | 392 | } |
| 429 | 393 | ||
| 430 | void | 394 | void export_symbol(const char *name) |
| 431 | export_symbol(const char *name) | ||
| 432 | { | 395 | { |
| 433 | struct symbol *sym; | 396 | struct symbol *sym; |
| 434 | 397 | ||
| 435 | sym = find_symbol(name, SYM_NORMAL); | 398 | sym = find_symbol(name, SYM_NORMAL); |
| 436 | if (!sym) | 399 | if (!sym) |
| 437 | error_with_pos("export undefined symbol %s", name); | 400 | error_with_pos("export undefined symbol %s", name); |
| 438 | else | 401 | else { |
| 439 | { | 402 | unsigned long crc; |
| 440 | unsigned long crc; | ||
| 441 | 403 | ||
| 442 | if (flag_dump_defs) | 404 | if (flag_dump_defs) |
| 443 | fprintf(debugfile, "Export %s == <", name); | 405 | fprintf(debugfile, "Export %s == <", name); |
| 444 | 406 | ||
| 445 | expansion_trail = (struct symbol *)-1L; | 407 | expansion_trail = (struct symbol *)-1L; |
| 446 | 408 | ||
| 447 | crc = expand_and_crc_list(sym->defn, 0xffffffff) ^ 0xffffffff; | 409 | crc = expand_and_crc_list(sym->defn, 0xffffffff) ^ 0xffffffff; |
| 448 | 410 | ||
| 449 | sym = expansion_trail; | 411 | sym = expansion_trail; |
| 450 | while (sym != (struct symbol *)-1L) | 412 | while (sym != (struct symbol *)-1L) { |
| 451 | { | 413 | struct symbol *n = sym->expansion_trail; |
| 452 | struct symbol *n = sym->expansion_trail; | 414 | sym->expansion_trail = 0; |
| 453 | sym->expansion_trail = 0; | 415 | sym = n; |
| 454 | sym = n; | 416 | } |
| 455 | } | ||
| 456 | 417 | ||
| 457 | if (flag_dump_defs) | 418 | if (flag_dump_defs) |
| 458 | fputs(">\n", debugfile); | 419 | fputs(">\n", debugfile); |
| 459 | 420 | ||
| 460 | /* Used as a linker script. */ | 421 | /* Used as a linker script. */ |
| 461 | printf("__crc_%s = 0x%08lx ;\n", name, crc); | 422 | printf("%s__crc_%s = 0x%08lx ;\n", mod_prefix, name, crc); |
| 462 | } | 423 | } |
| 463 | } | 424 | } |
| 464 | 425 | ||
| 465 | /*----------------------------------------------------------------------*/ | 426 | /*----------------------------------------------------------------------*/ |
| 466 | 427 | void error_with_pos(const char *fmt, ...) | |
| 467 | void | ||
| 468 | error(const char *fmt, ...) | ||
| 469 | { | ||
| 470 | va_list args; | ||
| 471 | |||
| 472 | if (flag_warnings) | ||
| 473 | { | ||
| 474 | va_start(args, fmt); | ||
| 475 | vfprintf(stderr, fmt, args); | ||
| 476 | va_end(args); | ||
| 477 | putc('\n', stderr); | ||
| 478 | |||
| 479 | errors++; | ||
| 480 | } | ||
| 481 | } | ||
| 482 | |||
| 483 | void | ||
| 484 | error_with_pos(const char *fmt, ...) | ||
| 485 | { | 428 | { |
| 486 | va_list args; | 429 | va_list args; |
| 487 | 430 | ||
| 488 | if (flag_warnings) | 431 | if (flag_warnings) { |
| 489 | { | 432 | fprintf(stderr, "%s:%d: ", cur_filename ? : "<stdin>", |
| 490 | fprintf(stderr, "%s:%d: ", cur_filename ? : "<stdin>", cur_line); | 433 | cur_line); |
| 491 | 434 | ||
| 492 | va_start(args, fmt); | 435 | va_start(args, fmt); |
| 493 | vfprintf(stderr, fmt, args); | 436 | vfprintf(stderr, fmt, args); |
| 494 | va_end(args); | 437 | va_end(args); |
| 495 | putc('\n', stderr); | 438 | putc('\n', stderr); |
| 496 | 439 | ||
| 497 | errors++; | 440 | errors++; |
| 498 | } | 441 | } |
| 499 | } | 442 | } |
| 500 | 443 | ||
| 501 | 444 | static void genksyms_usage(void) | |
| 502 | void genksyms_usage(void) | ||
| 503 | { | 445 | { |
| 504 | fputs("Usage:\n" | 446 | fputs("Usage:\n" "genksyms [-dDwqhV] > /path/to/.tmp_obj.ver\n" "\n" |
| 505 | "genksyms [-dDwqhV] > /path/to/.tmp_obj.ver\n" | ||
| 506 | "\n" | ||
| 507 | #ifdef __GNU_LIBRARY__ | 447 | #ifdef __GNU_LIBRARY__ |
| 508 | " -d, --debug Increment the debug level (repeatable)\n" | 448 | " -d, --debug Increment the debug level (repeatable)\n" |
| 509 | " -D, --dump Dump expanded symbol defs (for debugging only)\n" | 449 | " -D, --dump Dump expanded symbol defs (for debugging only)\n" |
| @@ -511,81 +451,84 @@ void genksyms_usage(void) | |||
| 511 | " -q, --quiet Disable warnings (default)\n" | 451 | " -q, --quiet Disable warnings (default)\n" |
| 512 | " -h, --help Print this message\n" | 452 | " -h, --help Print this message\n" |
| 513 | " -V, --version Print the release version\n" | 453 | " -V, --version Print the release version\n" |
| 514 | #else /* __GNU_LIBRARY__ */ | 454 | #else /* __GNU_LIBRARY__ */ |
| 515 | " -d Increment the debug level (repeatable)\n" | 455 | " -d Increment the debug level (repeatable)\n" |
| 516 | " -D Dump expanded symbol defs (for debugging only)\n" | 456 | " -D Dump expanded symbol defs (for debugging only)\n" |
| 517 | " -w Enable warnings\n" | 457 | " -w Enable warnings\n" |
| 518 | " -q Disable warnings (default)\n" | 458 | " -q Disable warnings (default)\n" |
| 519 | " -h Print this message\n" | 459 | " -h Print this message\n" |
| 520 | " -V Print the release version\n" | 460 | " -V Print the release version\n" |
| 521 | #endif /* __GNU_LIBRARY__ */ | 461 | #endif /* __GNU_LIBRARY__ */ |
| 522 | , stderr); | 462 | , stderr); |
| 523 | } | 463 | } |
| 524 | 464 | ||
| 525 | int | 465 | int main(int argc, char **argv) |
| 526 | main(int argc, char **argv) | ||
| 527 | { | 466 | { |
| 528 | int o; | 467 | int o; |
| 529 | 468 | ||
| 530 | #ifdef __GNU_LIBRARY__ | 469 | #ifdef __GNU_LIBRARY__ |
| 531 | struct option long_opts[] = { | 470 | struct option long_opts[] = { |
| 532 | {"debug", 0, 0, 'd'}, | 471 | {"arch", 1, 0, 'a'}, |
| 533 | {"warnings", 0, 0, 'w'}, | 472 | {"debug", 0, 0, 'd'}, |
| 534 | {"quiet", 0, 0, 'q'}, | 473 | {"warnings", 0, 0, 'w'}, |
| 535 | {"dump", 0, 0, 'D'}, | 474 | {"quiet", 0, 0, 'q'}, |
| 536 | {"version", 0, 0, 'V'}, | 475 | {"dump", 0, 0, 'D'}, |
| 537 | {"help", 0, 0, 'h'}, | 476 | {"version", 0, 0, 'V'}, |
| 538 | {0, 0, 0, 0} | 477 | {"help", 0, 0, 'h'}, |
| 539 | }; | 478 | {0, 0, 0, 0} |
| 540 | 479 | }; | |
| 541 | while ((o = getopt_long(argc, argv, "dwqVDk:p:", | 480 | |
| 542 | &long_opts[0], NULL)) != EOF) | 481 | while ((o = getopt_long(argc, argv, "a:dwqVDk:p:", |
| 543 | #else /* __GNU_LIBRARY__ */ | 482 | &long_opts[0], NULL)) != EOF) |
| 544 | while ((o = getopt(argc, argv, "dwqVDk:p:")) != EOF) | 483 | #else /* __GNU_LIBRARY__ */ |
| 545 | #endif /* __GNU_LIBRARY__ */ | 484 | while ((o = getopt(argc, argv, "a:dwqVDk:p:")) != EOF) |
| 546 | switch (o) | 485 | #endif /* __GNU_LIBRARY__ */ |
| 547 | { | 486 | switch (o) { |
| 548 | case 'd': | 487 | case 'a': |
| 549 | flag_debug++; | 488 | arch = optarg; |
| 550 | break; | 489 | break; |
| 551 | case 'w': | 490 | case 'd': |
| 552 | flag_warnings = 1; | 491 | flag_debug++; |
| 553 | break; | 492 | break; |
| 554 | case 'q': | 493 | case 'w': |
| 555 | flag_warnings = 0; | 494 | flag_warnings = 1; |
| 556 | break; | 495 | break; |
| 557 | case 'V': | 496 | case 'q': |
| 558 | fputs("genksyms version 2.5.60\n", stderr); | 497 | flag_warnings = 0; |
| 559 | break; | 498 | break; |
| 560 | case 'D': | 499 | case 'V': |
| 561 | flag_dump_defs = 1; | 500 | fputs("genksyms version 2.5.60\n", stderr); |
| 562 | break; | 501 | break; |
| 563 | case 'h': | 502 | case 'D': |
| 564 | genksyms_usage(); | 503 | flag_dump_defs = 1; |
| 565 | return 0; | 504 | break; |
| 566 | default: | 505 | case 'h': |
| 567 | genksyms_usage(); | 506 | genksyms_usage(); |
| 568 | return 1; | 507 | return 0; |
| 569 | } | 508 | default: |
| 570 | 509 | genksyms_usage(); | |
| 571 | { | 510 | return 1; |
| 572 | extern int yydebug; | 511 | } |
| 573 | extern int yy_flex_debug; | 512 | if ((strcmp(arch, "v850") == 0) || (strcmp(arch, "h8300") == 0)) |
| 574 | 513 | mod_prefix = "_"; | |
| 575 | yydebug = (flag_debug > 1); | 514 | { |
| 576 | yy_flex_debug = (flag_debug > 2); | 515 | extern int yydebug; |
| 577 | 516 | extern int yy_flex_debug; | |
| 578 | debugfile = stderr; | 517 | |
| 579 | /* setlinebuf(debugfile); */ | 518 | yydebug = (flag_debug > 1); |
| 580 | } | 519 | yy_flex_debug = (flag_debug > 2); |
| 581 | 520 | ||
| 582 | yyparse(); | 521 | debugfile = stderr; |
| 583 | 522 | /* setlinebuf(debugfile); */ | |
| 584 | if (flag_debug) | 523 | } |
| 585 | { | 524 | |
| 586 | fprintf(debugfile, "Hash table occupancy %d/%d = %g\n", | 525 | yyparse(); |
| 587 | nsyms, HASH_BUCKETS, (double)nsyms / (double)HASH_BUCKETS); | 526 | |
| 588 | } | 527 | if (flag_debug) { |
| 589 | 528 | fprintf(debugfile, "Hash table occupancy %d/%d = %g\n", | |
| 590 | return errors != 0; | 529 | nsyms, HASH_BUCKETS, |
| 530 | (double)nsyms / (double)HASH_BUCKETS); | ||
| 531 | } | ||
| 532 | |||
| 533 | return errors != 0; | ||
| 591 | } | 534 | } |
diff --git a/scripts/genksyms/genksyms.h b/scripts/genksyms/genksyms.h index f09af47ab281..ab6f34f38735 100644 --- a/scripts/genksyms/genksyms.h +++ b/scripts/genksyms/genksyms.h | |||
| @@ -20,74 +20,51 @@ | |||
| 20 | along with this program; if not, write to the Free Software Foundation, | 20 | along with this program; if not, write to the Free Software Foundation, |
| 21 | Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | 21 | Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
| 22 | 22 | ||
| 23 | |||
| 24 | #ifndef MODUTILS_GENKSYMS_H | 23 | #ifndef MODUTILS_GENKSYMS_H |
| 25 | #define MODUTILS_GENKSYMS_H 1 | 24 | #define MODUTILS_GENKSYMS_H 1 |
| 26 | 25 | ||
| 27 | #include <stdio.h> | 26 | #include <stdio.h> |
| 28 | 27 | ||
| 29 | 28 | enum symbol_type { | |
| 30 | enum symbol_type | 29 | SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION |
| 31 | { | ||
| 32 | SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION | ||
| 33 | }; | 30 | }; |
| 34 | 31 | ||
| 35 | struct string_list | 32 | struct string_list { |
| 36 | { | 33 | struct string_list *next; |
| 37 | struct string_list *next; | 34 | enum symbol_type tag; |
| 38 | enum symbol_type tag; | 35 | char *string; |
| 39 | char *string; | ||
| 40 | }; | 36 | }; |
| 41 | 37 | ||
| 42 | struct symbol | 38 | struct symbol { |
| 43 | { | 39 | struct symbol *hash_next; |
| 44 | struct symbol *hash_next; | 40 | const char *name; |
| 45 | const char *name; | 41 | enum symbol_type type; |
| 46 | enum symbol_type type; | 42 | struct string_list *defn; |
| 47 | struct string_list *defn; | 43 | struct symbol *expansion_trail; |
| 48 | struct symbol *expansion_trail; | 44 | int is_extern; |
| 49 | int is_extern; | ||
| 50 | }; | 45 | }; |
| 51 | 46 | ||
| 52 | typedef struct string_list **yystype; | 47 | typedef struct string_list **yystype; |
| 53 | #define YYSTYPE yystype | 48 | #define YYSTYPE yystype |
| 54 | 49 | ||
| 55 | extern FILE *outfile, *debugfile; | ||
| 56 | |||
| 57 | extern int cur_line; | 50 | extern int cur_line; |
| 58 | extern char *cur_filename, *output_directory; | 51 | extern char *cur_filename; |
| 59 | |||
| 60 | extern int flag_debug, flag_dump_defs, flag_warnings; | ||
| 61 | extern int checksum_version, kernel_version; | ||
| 62 | |||
| 63 | extern int want_brace_phrase, want_exp_phrase, discard_phrase_contents; | ||
| 64 | extern struct string_list *current_list, *next_list; | ||
| 65 | |||
| 66 | 52 | ||
| 67 | struct symbol *find_symbol(const char *name, enum symbol_type ns); | 53 | struct symbol *find_symbol(const char *name, enum symbol_type ns); |
| 68 | struct symbol *add_symbol(const char *name, enum symbol_type type, | 54 | struct symbol *add_symbol(const char *name, enum symbol_type type, |
| 69 | struct string_list *defn, int is_extern); | 55 | struct string_list *defn, int is_extern); |
| 70 | void export_symbol(const char *); | 56 | void export_symbol(const char *); |
| 71 | 57 | ||
| 72 | struct string_list *reset_list(void); | ||
| 73 | void free_list(struct string_list *s, struct string_list *e); | ||
| 74 | void free_node(struct string_list *list); | 58 | void free_node(struct string_list *list); |
| 59 | void free_list(struct string_list *s, struct string_list *e); | ||
| 75 | struct string_list *copy_node(struct string_list *); | 60 | struct string_list *copy_node(struct string_list *); |
| 76 | struct string_list *copy_list(struct string_list *s, struct string_list *e); | ||
| 77 | int equal_list(struct string_list *a, struct string_list *b); | ||
| 78 | void print_list(FILE *, struct string_list *list); | ||
| 79 | 61 | ||
| 80 | int yylex(void); | 62 | int yylex(void); |
| 81 | int yyparse(void); | 63 | int yyparse(void); |
| 82 | 64 | ||
| 83 | void error_with_pos(const char *, ...); | 65 | void error_with_pos(const char *, ...); |
| 84 | 66 | ||
| 85 | #define version(a,b,c) ((a << 16) | (b << 8) | (c)) | ||
| 86 | |||
| 87 | /*----------------------------------------------------------------------*/ | 67 | /*----------------------------------------------------------------------*/ |
| 88 | |||
| 89 | #define MODUTILS_VERSION "<in-kernel>" | ||
| 90 | |||
| 91 | #define xmalloc(size) ({ void *__ptr = malloc(size); \ | 68 | #define xmalloc(size) ({ void *__ptr = malloc(size); \ |
| 92 | if(!__ptr && size != 0) { \ | 69 | if(!__ptr && size != 0) { \ |
| 93 | fprintf(stderr, "out of memory\n"); \ | 70 | fprintf(stderr, "out of memory\n"); \ |
| @@ -101,4 +78,4 @@ void error_with_pos(const char *, ...); | |||
| 101 | } \ | 78 | } \ |
| 102 | __str; }) | 79 | __str; }) |
| 103 | 80 | ||
| 104 | #endif /* genksyms.h */ | 81 | #endif /* genksyms.h */ |
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 5760e057ecba..e6499db4c8cc 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | # Kernel configuration targets | 2 | # Kernel configuration targets |
| 3 | # These targets are used from top-level makefile | 3 | # These targets are used from top-level makefile |
| 4 | 4 | ||
| 5 | .PHONY: oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config | 5 | PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config |
| 6 | 6 | ||
| 7 | xconfig: $(obj)/qconf | 7 | xconfig: $(obj)/qconf |
| 8 | $< arch/$(ARCH)/Kconfig | 8 | $< arch/$(ARCH)/Kconfig |
| @@ -42,7 +42,7 @@ update-po-config: $(obj)/kxgettext | |||
| 42 | $(Q)rm -f arch/um/Kconfig_arch | 42 | $(Q)rm -f arch/um/Kconfig_arch |
| 43 | $(Q)rm -f scripts/kconfig/linux_*.pot scripts/kconfig/config.pot | 43 | $(Q)rm -f scripts/kconfig/linux_*.pot scripts/kconfig/config.pot |
| 44 | 44 | ||
| 45 | .PHONY: randconfig allyesconfig allnoconfig allmodconfig defconfig | 45 | PHONY += randconfig allyesconfig allnoconfig allmodconfig defconfig |
| 46 | 46 | ||
| 47 | randconfig: $(obj)/conf | 47 | randconfig: $(obj)/conf |
| 48 | $< -r arch/$(ARCH)/Kconfig | 48 | $< -r arch/$(ARCH)/Kconfig |
| @@ -78,7 +78,7 @@ help: | |||
| 78 | @echo ' defconfig - New config with default answer to all options' | 78 | @echo ' defconfig - New config with default answer to all options' |
| 79 | @echo ' allmodconfig - New config selecting modules when possible' | 79 | @echo ' allmodconfig - New config selecting modules when possible' |
| 80 | @echo ' allyesconfig - New config where all options are accepted with yes' | 80 | @echo ' allyesconfig - New config where all options are accepted with yes' |
| 81 | @echo ' allnoconfig - New minimal config' | 81 | @echo ' allnoconfig - New config where all options are answered with no' |
| 82 | 82 | ||
| 83 | # =========================================================================== | 83 | # =========================================================================== |
| 84 | # Shared Makefile for the various kconfig executables: | 84 | # Shared Makefile for the various kconfig executables: |
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index b0cbbe2e41bb..1b8882ddbc74 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
| @@ -374,6 +374,7 @@ int conf_write(const char *name) | |||
| 374 | out_h = fopen(".tmpconfig.h", "w"); | 374 | out_h = fopen(".tmpconfig.h", "w"); |
| 375 | if (!out_h) | 375 | if (!out_h) |
| 376 | return 1; | 376 | return 1; |
| 377 | file_write_dep(NULL); | ||
| 377 | } | 378 | } |
| 378 | sym = sym_lookup("KERNELVERSION", 0); | 379 | sym = sym_lookup("KERNELVERSION", 0); |
| 379 | sym_calc_value(sym); | 380 | sym_calc_value(sym); |
| @@ -512,7 +513,6 @@ int conf_write(const char *name) | |||
| 512 | if (out_h) { | 513 | if (out_h) { |
| 513 | fclose(out_h); | 514 | fclose(out_h); |
| 514 | rename(".tmpconfig.h", "include/linux/autoconf.h"); | 515 | rename(".tmpconfig.h", "include/linux/autoconf.h"); |
| 515 | file_write_dep(NULL); | ||
| 516 | } | 516 | } |
| 517 | if (!name || basename != conf_def_filename) { | 517 | if (!name || basename != conf_def_filename) { |
| 518 | if (!name) | 518 | if (!name) |
diff --git a/scripts/kconfig/lxdialog/Makefile b/scripts/kconfig/lxdialog/Makefile index bbf4887cff74..a8b026326247 100644 --- a/scripts/kconfig/lxdialog/Makefile +++ b/scripts/kconfig/lxdialog/Makefile | |||
| @@ -7,10 +7,10 @@ check-lxdialog := $(srctree)/$(src)/check-lxdialog.sh | |||
| 7 | # we really need to do so. (Do not call gcc as part of make mrproper) | 7 | # we really need to do so. (Do not call gcc as part of make mrproper) |
| 8 | HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) | 8 | HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) |
| 9 | HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC)) | 9 | HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC)) |
| 10 | |||
| 11 | HOST_EXTRACFLAGS += -DLOCALE | ||
| 12 | 10 | ||
| 13 | .PHONY: dochecklxdialog | 11 | HOST_EXTRACFLAGS += -DLOCALE |
| 12 | |||
| 13 | PHONY += dochecklxdialog | ||
| 14 | $(obj)/dochecklxdialog: | 14 | $(obj)/dochecklxdialog: |
| 15 | $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_LOADLIBES) | 15 | $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_LOADLIBES) |
| 16 | 16 | ||
diff --git a/scripts/mkmakefile b/scripts/mkmakefile index c4d621b30d0d..a22cbedd3b3e 100644 --- a/scripts/mkmakefile +++ b/scripts/mkmakefile | |||
| @@ -21,11 +21,13 @@ KERNELOUTPUT := $2 | |||
| 21 | 21 | ||
| 22 | MAKEFLAGS += --no-print-directory | 22 | MAKEFLAGS += --no-print-directory |
| 23 | 23 | ||
| 24 | .PHONY: all \$(MAKECMDGOALS) | ||
| 25 | |||
| 24 | all: | 26 | all: |
| 25 | \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) | 27 | \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) |
| 26 | 28 | ||
| 27 | %:: | 29 | Makefile:; |
| 28 | \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) \$@ | ||
| 29 | 30 | ||
| 31 | \$(filter-out all Makefile,\$(MAKECMDGOALS)) %/: | ||
| 32 | \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) \$@ | ||
| 30 | EOF | 33 | EOF |
| 31 | |||
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index c164b230ad6f..84e21201f3c0 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
| @@ -34,7 +34,7 @@ typedef uint16_t __u16; | |||
| 34 | typedef unsigned char __u8; | 34 | typedef unsigned char __u8; |
| 35 | 35 | ||
| 36 | /* Big exception to the "don't include kernel headers into userspace, which | 36 | /* Big exception to the "don't include kernel headers into userspace, which |
| 37 | * even potentially has different endianness and word sizes, since | 37 | * even potentially has different endianness and word sizes, since |
| 38 | * we handle those differences explicitly below */ | 38 | * we handle those differences explicitly below */ |
| 39 | #include "../../include/linux/mod_devicetable.h" | 39 | #include "../../include/linux/mod_devicetable.h" |
| 40 | #include "../../include/linux/input.h" | 40 | #include "../../include/linux/input.h" |
| @@ -153,8 +153,8 @@ static void do_usb_table(void *symval, unsigned long size, | |||
| 153 | const unsigned long id_size = sizeof(struct usb_device_id); | 153 | const unsigned long id_size = sizeof(struct usb_device_id); |
| 154 | 154 | ||
| 155 | if (size % id_size || size < id_size) { | 155 | if (size % id_size || size < id_size) { |
| 156 | fprintf(stderr, "*** Warning: %s ids %lu bad size " | 156 | warn("%s ids %lu bad size " |
| 157 | "(each on %lu)\n", mod->name, size, id_size); | 157 | "(each on %lu)\n", mod->name, size, id_size); |
| 158 | } | 158 | } |
| 159 | /* Leave last one: it's the terminator. */ | 159 | /* Leave last one: it's the terminator. */ |
| 160 | size -= id_size; | 160 | size -= id_size; |
| @@ -217,9 +217,8 @@ static int do_pci_entry(const char *filename, | |||
| 217 | if ((baseclass_mask != 0 && baseclass_mask != 0xFF) | 217 | if ((baseclass_mask != 0 && baseclass_mask != 0xFF) |
| 218 | || (subclass_mask != 0 && subclass_mask != 0xFF) | 218 | || (subclass_mask != 0 && subclass_mask != 0xFF) |
| 219 | || (interface_mask != 0 && interface_mask != 0xFF)) { | 219 | || (interface_mask != 0 && interface_mask != 0xFF)) { |
| 220 | fprintf(stderr, | 220 | warn("Can't handle masks in %s:%04X\n", |
| 221 | "*** Warning: Can't handle masks in %s:%04X\n", | 221 | filename, id->class_mask); |
| 222 | filename, id->class_mask); | ||
| 223 | return 0; | 222 | return 0; |
| 224 | } | 223 | } |
| 225 | 224 | ||
| @@ -229,7 +228,7 @@ static int do_pci_entry(const char *filename, | |||
| 229 | return 1; | 228 | return 1; |
| 230 | } | 229 | } |
| 231 | 230 | ||
| 232 | /* looks like: "ccw:tNmNdtNdmN" */ | 231 | /* looks like: "ccw:tNmNdtNdmN" */ |
| 233 | static int do_ccw_entry(const char *filename, | 232 | static int do_ccw_entry(const char *filename, |
| 234 | struct ccw_device_id *id, char *alias) | 233 | struct ccw_device_id *id, char *alias) |
| 235 | { | 234 | { |
| @@ -445,8 +444,8 @@ static void do_table(void *symval, unsigned long size, | |||
| 445 | int (*do_entry)(const char *, void *entry, char *alias) = function; | 444 | int (*do_entry)(const char *, void *entry, char *alias) = function; |
| 446 | 445 | ||
| 447 | if (size % id_size || size < id_size) { | 446 | if (size % id_size || size < id_size) { |
| 448 | fprintf(stderr, "*** Warning: %s ids %lu bad size " | 447 | warn("%s ids %lu bad size " |
| 449 | "(each on %lu)\n", mod->name, size, id_size); | 448 | "(each on %lu)\n", mod->name, size, id_size); |
| 450 | } | 449 | } |
| 451 | /* Leave last one: it's the terminator. */ | 450 | /* Leave last one: it's the terminator. */ |
| 452 | size -= id_size; | 451 | size -= id_size; |
diff --git a/scripts/mod/mk_elfconfig.c b/scripts/mod/mk_elfconfig.c index de2aabf89fb3..3c92c83733f4 100644 --- a/scripts/mod/mk_elfconfig.c +++ b/scripts/mod/mk_elfconfig.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | int | 6 | int |
| 7 | main(int argc, char **argv) | 7 | main(int argc, char **argv) |
| 8 | { | 8 | { |
| 9 | unsigned char ei[EI_NIDENT]; | 9 | unsigned char ei[EI_NIDENT]; |
| 10 | union { short s; char c[2]; } endian_test; | 10 | union { short s; char c[2]; } endian_test; |
| 11 | 11 | ||
| 12 | if (argc != 2) { | 12 | if (argc != 2) { |
| @@ -57,7 +57,7 @@ main(int argc, char **argv) | |||
| 57 | 57 | ||
| 58 | if ((strcmp(argv[1], "v850") == 0) || (strcmp(argv[1], "h8300") == 0)) | 58 | if ((strcmp(argv[1], "v850") == 0) || (strcmp(argv[1], "h8300") == 0)) |
| 59 | printf("#define MODULE_SYMBOL_PREFIX \"_\"\n"); | 59 | printf("#define MODULE_SYMBOL_PREFIX \"_\"\n"); |
| 60 | else | 60 | else |
| 61 | printf("#define MODULE_SYMBOL_PREFIX \"\"\n"); | 61 | printf("#define MODULE_SYMBOL_PREFIX \"\"\n"); |
| 62 | 62 | ||
| 63 | return 0; | 63 | return 0; |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index b8b2a560b26b..0b92ddff26fd 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * | 2 | * |
| 3 | * Copyright 2003 Kai Germaschewski | 3 | * Copyright 2003 Kai Germaschewski |
| 4 | * Copyright 2002-2004 Rusty Russell, IBM Corporation | 4 | * Copyright 2002-2004 Rusty Russell, IBM Corporation |
| 5 | * | 5 | * Copyright 2006 Sam Ravnborg |
| 6 | * Based in part on module-init-tools/depmod.c,file2alias | 6 | * Based in part on module-init-tools/depmod.c,file2alias |
| 7 | * | 7 | * |
| 8 | * This software may be used and distributed according to the terms | 8 | * This software may be used and distributed according to the terms |
| @@ -20,9 +20,10 @@ int modversions = 0; | |||
| 20 | int have_vmlinux = 0; | 20 | int have_vmlinux = 0; |
| 21 | /* Is CONFIG_MODULE_SRCVERSION_ALL set? */ | 21 | /* Is CONFIG_MODULE_SRCVERSION_ALL set? */ |
| 22 | static int all_versions = 0; | 22 | static int all_versions = 0; |
| 23 | /* If we are modposting external module set to 1 */ | ||
| 24 | static int external_module = 0; | ||
| 23 | 25 | ||
| 24 | void | 26 | void fatal(const char *fmt, ...) |
| 25 | fatal(const char *fmt, ...) | ||
| 26 | { | 27 | { |
| 27 | va_list arglist; | 28 | va_list arglist; |
| 28 | 29 | ||
| @@ -35,8 +36,7 @@ fatal(const char *fmt, ...) | |||
| 35 | exit(1); | 36 | exit(1); |
| 36 | } | 37 | } |
| 37 | 38 | ||
| 38 | void | 39 | void warn(const char *fmt, ...) |
| 39 | warn(const char *fmt, ...) | ||
| 40 | { | 40 | { |
| 41 | va_list arglist; | 41 | va_list arglist; |
| 42 | 42 | ||
| @@ -47,6 +47,18 @@ warn(const char *fmt, ...) | |||
| 47 | va_end(arglist); | 47 | va_end(arglist); |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | static int is_vmlinux(const char *modname) | ||
| 51 | { | ||
| 52 | const char *myname; | ||
| 53 | |||
| 54 | if ((myname = strrchr(modname, '/'))) | ||
| 55 | myname++; | ||
| 56 | else | ||
| 57 | myname = modname; | ||
| 58 | |||
| 59 | return strcmp(myname, "vmlinux") == 0; | ||
| 60 | } | ||
| 61 | |||
| 50 | void *do_nofail(void *ptr, const char *expr) | 62 | void *do_nofail(void *ptr, const char *expr) |
| 51 | { | 63 | { |
| 52 | if (!ptr) { | 64 | if (!ptr) { |
| @@ -59,8 +71,7 @@ void *do_nofail(void *ptr, const char *expr) | |||
| 59 | 71 | ||
| 60 | static struct module *modules; | 72 | static struct module *modules; |
| 61 | 73 | ||
| 62 | struct module * | 74 | static struct module *find_module(char *modname) |
| 63 | find_module(char *modname) | ||
| 64 | { | 75 | { |
| 65 | struct module *mod; | 76 | struct module *mod; |
| 66 | 77 | ||
| @@ -70,12 +81,11 @@ find_module(char *modname) | |||
| 70 | return mod; | 81 | return mod; |
| 71 | } | 82 | } |
| 72 | 83 | ||
| 73 | struct module * | 84 | static struct module *new_module(char *modname) |
| 74 | new_module(char *modname) | ||
| 75 | { | 85 | { |
| 76 | struct module *mod; | 86 | struct module *mod; |
| 77 | char *p, *s; | 87 | char *p, *s; |
| 78 | 88 | ||
| 79 | mod = NOFAIL(malloc(sizeof(*mod))); | 89 | mod = NOFAIL(malloc(sizeof(*mod))); |
| 80 | memset(mod, 0, sizeof(*mod)); | 90 | memset(mod, 0, sizeof(*mod)); |
| 81 | p = NOFAIL(strdup(modname)); | 91 | p = NOFAIL(strdup(modname)); |
| @@ -104,6 +114,10 @@ struct symbol { | |||
| 104 | unsigned int crc; | 114 | unsigned int crc; |
| 105 | int crc_valid; | 115 | int crc_valid; |
| 106 | unsigned int weak:1; | 116 | unsigned int weak:1; |
| 117 | unsigned int vmlinux:1; /* 1 if symbol is defined in vmlinux */ | ||
| 118 | unsigned int kernel:1; /* 1 if symbol is from kernel | ||
| 119 | * (only for external modules) **/ | ||
| 120 | unsigned int preloaded:1; /* 1 if symbol from Module.symvers */ | ||
| 107 | char name[0]; | 121 | char name[0]; |
| 108 | }; | 122 | }; |
| 109 | 123 | ||
| @@ -122,11 +136,12 @@ static inline unsigned int tdb_hash(const char *name) | |||
| 122 | return (1103515243 * value + 12345); | 136 | return (1103515243 * value + 12345); |
| 123 | } | 137 | } |
| 124 | 138 | ||
| 125 | /* Allocate a new symbols for use in the hash of exported symbols or | 139 | /** |
| 126 | * the list of unresolved symbols per module */ | 140 | * Allocate a new symbols for use in the hash of exported symbols or |
| 127 | 141 | * the list of unresolved symbols per module | |
| 128 | struct symbol * | 142 | **/ |
| 129 | alloc_symbol(const char *name, unsigned int weak, struct symbol *next) | 143 | static struct symbol *alloc_symbol(const char *name, unsigned int weak, |
| 144 | struct symbol *next) | ||
| 130 | { | 145 | { |
| 131 | struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1)); | 146 | struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1)); |
| 132 | 147 | ||
| @@ -138,9 +153,7 @@ alloc_symbol(const char *name, unsigned int weak, struct symbol *next) | |||
| 138 | } | 153 | } |
| 139 | 154 | ||
| 140 | /* For the hash of exported symbols */ | 155 | /* For the hash of exported symbols */ |
| 141 | 156 | static struct symbol *new_symbol(const char *name, struct module *module) | |
| 142 | void | ||
| 143 | new_symbol(const char *name, struct module *module, unsigned int *crc) | ||
| 144 | { | 157 | { |
| 145 | unsigned int hash; | 158 | unsigned int hash; |
| 146 | struct symbol *new; | 159 | struct symbol *new; |
| @@ -148,14 +161,10 @@ new_symbol(const char *name, struct module *module, unsigned int *crc) | |||
| 148 | hash = tdb_hash(name) % SYMBOL_HASH_SIZE; | 161 | hash = tdb_hash(name) % SYMBOL_HASH_SIZE; |
| 149 | new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]); | 162 | new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]); |
| 150 | new->module = module; | 163 | new->module = module; |
| 151 | if (crc) { | 164 | return new; |
| 152 | new->crc = *crc; | ||
| 153 | new->crc_valid = 1; | ||
| 154 | } | ||
| 155 | } | 165 | } |
| 156 | 166 | ||
| 157 | struct symbol * | 167 | static struct symbol *find_symbol(const char *name) |
| 158 | find_symbol(const char *name) | ||
| 159 | { | 168 | { |
| 160 | struct symbol *s; | 169 | struct symbol *s; |
| 161 | 170 | ||
| @@ -170,25 +179,42 @@ find_symbol(const char *name) | |||
| 170 | return NULL; | 179 | return NULL; |
| 171 | } | 180 | } |
| 172 | 181 | ||
| 173 | /* Add an exported symbol - it may have already been added without a | 182 | /** |
| 174 | * CRC, in this case just update the CRC */ | 183 | * Add an exported symbol - it may have already been added without a |
| 175 | void | 184 | * CRC, in this case just update the CRC |
| 176 | add_exported_symbol(const char *name, struct module *module, unsigned int *crc) | 185 | **/ |
| 186 | static struct symbol *sym_add_exported(const char *name, struct module *mod) | ||
| 177 | { | 187 | { |
| 178 | struct symbol *s = find_symbol(name); | 188 | struct symbol *s = find_symbol(name); |
| 179 | 189 | ||
| 180 | if (!s) { | 190 | if (!s) { |
| 181 | new_symbol(name, module, crc); | 191 | s = new_symbol(name, mod); |
| 182 | return; | 192 | } else { |
| 183 | } | 193 | if (!s->preloaded) { |
| 184 | if (crc) { | 194 | warn("%s: '%s' exported twice. Previous export " |
| 185 | s->crc = *crc; | 195 | "was in %s%s\n", mod->name, name, |
| 186 | s->crc_valid = 1; | 196 | s->module->name, |
| 197 | is_vmlinux(s->module->name) ?"":".ko"); | ||
| 198 | } | ||
| 187 | } | 199 | } |
| 200 | s->preloaded = 0; | ||
| 201 | s->vmlinux = is_vmlinux(mod->name); | ||
| 202 | s->kernel = 0; | ||
| 203 | return s; | ||
| 204 | } | ||
| 205 | |||
| 206 | static void sym_update_crc(const char *name, struct module *mod, | ||
| 207 | unsigned int crc) | ||
| 208 | { | ||
| 209 | struct symbol *s = find_symbol(name); | ||
| 210 | |||
| 211 | if (!s) | ||
| 212 | s = new_symbol(name, mod); | ||
| 213 | s->crc = crc; | ||
| 214 | s->crc_valid = 1; | ||
| 188 | } | 215 | } |
| 189 | 216 | ||
| 190 | void * | 217 | void *grab_file(const char *filename, unsigned long *size) |
| 191 | grab_file(const char *filename, unsigned long *size) | ||
| 192 | { | 218 | { |
| 193 | struct stat st; | 219 | struct stat st; |
| 194 | void *map; | 220 | void *map; |
| @@ -207,13 +233,12 @@ grab_file(const char *filename, unsigned long *size) | |||
| 207 | return map; | 233 | return map; |
| 208 | } | 234 | } |
| 209 | 235 | ||
| 210 | /* | 236 | /** |
| 211 | Return a copy of the next line in a mmap'ed file. | 237 | * Return a copy of the next line in a mmap'ed file. |
| 212 | spaces in the beginning of the line is trimmed away. | 238 | * spaces in the beginning of the line is trimmed away. |
| 213 | Return a pointer to a static buffer. | 239 | * Return a pointer to a static buffer. |
| 214 | */ | 240 | **/ |
| 215 | char* | 241 | char* get_next_line(unsigned long *pos, void *file, unsigned long size) |
| 216 | get_next_line(unsigned long *pos, void *file, unsigned long size) | ||
| 217 | { | 242 | { |
| 218 | static char line[4096]; | 243 | static char line[4096]; |
| 219 | int skip = 1; | 244 | int skip = 1; |
| @@ -243,14 +268,12 @@ get_next_line(unsigned long *pos, void *file, unsigned long size) | |||
| 243 | return NULL; | 268 | return NULL; |
| 244 | } | 269 | } |
| 245 | 270 | ||
| 246 | void | 271 | void release_file(void *file, unsigned long size) |
| 247 | release_file(void *file, unsigned long size) | ||
| 248 | { | 272 | { |
| 249 | munmap(file, size); | 273 | munmap(file, size); |
| 250 | } | 274 | } |
| 251 | 275 | ||
| 252 | void | 276 | static void parse_elf(struct elf_info *info, const char *filename) |
| 253 | parse_elf(struct elf_info *info, const char *filename) | ||
| 254 | { | 277 | { |
| 255 | unsigned int i; | 278 | unsigned int i; |
| 256 | Elf_Ehdr *hdr = info->hdr; | 279 | Elf_Ehdr *hdr = info->hdr; |
| @@ -297,14 +320,13 @@ parse_elf(struct elf_info *info, const char *filename) | |||
| 297 | continue; | 320 | continue; |
| 298 | 321 | ||
| 299 | info->symtab_start = (void *)hdr + sechdrs[i].sh_offset; | 322 | info->symtab_start = (void *)hdr + sechdrs[i].sh_offset; |
| 300 | info->symtab_stop = (void *)hdr + sechdrs[i].sh_offset | 323 | info->symtab_stop = (void *)hdr + sechdrs[i].sh_offset |
| 301 | + sechdrs[i].sh_size; | 324 | + sechdrs[i].sh_size; |
| 302 | info->strtab = (void *)hdr + | 325 | info->strtab = (void *)hdr + |
| 303 | sechdrs[sechdrs[i].sh_link].sh_offset; | 326 | sechdrs[sechdrs[i].sh_link].sh_offset; |
| 304 | } | 327 | } |
| 305 | if (!info->symtab_start) { | 328 | if (!info->symtab_start) { |
| 306 | fprintf(stderr, "modpost: %s no symtab?\n", filename); | 329 | fatal("%s has no symtab?\n", filename); |
| 307 | abort(); | ||
| 308 | } | 330 | } |
| 309 | /* Fix endianness in symbols */ | 331 | /* Fix endianness in symbols */ |
| 310 | for (sym = info->symtab_start; sym < info->symtab_stop; sym++) { | 332 | for (sym = info->symtab_start; sym < info->symtab_stop; sym++) { |
| @@ -316,36 +338,31 @@ parse_elf(struct elf_info *info, const char *filename) | |||
| 316 | return; | 338 | return; |
| 317 | 339 | ||
| 318 | truncated: | 340 | truncated: |
| 319 | fprintf(stderr, "modpost: %s is truncated.\n", filename); | 341 | fatal("%s is truncated.\n", filename); |
| 320 | abort(); | ||
| 321 | } | 342 | } |
| 322 | 343 | ||
| 323 | void | 344 | static void parse_elf_finish(struct elf_info *info) |
| 324 | parse_elf_finish(struct elf_info *info) | ||
| 325 | { | 345 | { |
| 326 | release_file(info->hdr, info->size); | 346 | release_file(info->hdr, info->size); |
| 327 | } | 347 | } |
| 328 | 348 | ||
| 329 | #define CRC_PFX "__crc_" | 349 | #define CRC_PFX MODULE_SYMBOL_PREFIX "__crc_" |
| 330 | #define KSYMTAB_PFX "__ksymtab_" | 350 | #define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_" |
| 331 | 351 | ||
| 332 | void | 352 | static void handle_modversions(struct module *mod, struct elf_info *info, |
| 333 | handle_modversions(struct module *mod, struct elf_info *info, | 353 | Elf_Sym *sym, const char *symname) |
| 334 | Elf_Sym *sym, const char *symname) | ||
| 335 | { | 354 | { |
| 336 | unsigned int crc; | 355 | unsigned int crc; |
| 337 | 356 | ||
| 338 | switch (sym->st_shndx) { | 357 | switch (sym->st_shndx) { |
| 339 | case SHN_COMMON: | 358 | case SHN_COMMON: |
| 340 | fprintf(stderr, "*** Warning: \"%s\" [%s] is COMMON symbol\n", | 359 | warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name); |
| 341 | symname, mod->name); | ||
| 342 | break; | 360 | break; |
| 343 | case SHN_ABS: | 361 | case SHN_ABS: |
| 344 | /* CRC'd symbol */ | 362 | /* CRC'd symbol */ |
| 345 | if (memcmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) { | 363 | if (memcmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) { |
| 346 | crc = (unsigned int) sym->st_value; | 364 | crc = (unsigned int) sym->st_value; |
| 347 | add_exported_symbol(symname + strlen(CRC_PFX), | 365 | sym_update_crc(symname + strlen(CRC_PFX), mod, crc); |
| 348 | mod, &crc); | ||
| 349 | } | 366 | } |
| 350 | break; | 367 | break; |
| 351 | case SHN_UNDEF: | 368 | case SHN_UNDEF: |
| @@ -370,15 +387,15 @@ handle_modversions(struct module *mod, struct elf_info *info, | |||
| 370 | /* Ignore register directives. */ | 387 | /* Ignore register directives. */ |
| 371 | if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER) | 388 | if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER) |
| 372 | break; | 389 | break; |
| 373 | if (symname[0] == '.') { | 390 | if (symname[0] == '.') { |
| 374 | char *munged = strdup(symname); | 391 | char *munged = strdup(symname); |
| 375 | munged[0] = '_'; | 392 | munged[0] = '_'; |
| 376 | munged[1] = toupper(munged[1]); | 393 | munged[1] = toupper(munged[1]); |
| 377 | symname = munged; | 394 | symname = munged; |
| 378 | } | 395 | } |
| 379 | } | 396 | } |
| 380 | #endif | 397 | #endif |
| 381 | 398 | ||
| 382 | if (memcmp(symname, MODULE_SYMBOL_PREFIX, | 399 | if (memcmp(symname, MODULE_SYMBOL_PREFIX, |
| 383 | strlen(MODULE_SYMBOL_PREFIX)) == 0) | 400 | strlen(MODULE_SYMBOL_PREFIX)) == 0) |
| 384 | mod->unres = alloc_symbol(symname + | 401 | mod->unres = alloc_symbol(symname + |
| @@ -389,8 +406,7 @@ handle_modversions(struct module *mod, struct elf_info *info, | |||
| 389 | default: | 406 | default: |
| 390 | /* All exported symbols */ | 407 | /* All exported symbols */ |
| 391 | if (memcmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) { | 408 | if (memcmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) { |
| 392 | add_exported_symbol(symname + strlen(KSYMTAB_PFX), | 409 | sym_add_exported(symname + strlen(KSYMTAB_PFX), mod); |
| 393 | mod, NULL); | ||
| 394 | } | 410 | } |
| 395 | if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0) | 411 | if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0) |
| 396 | mod->has_init = 1; | 412 | mod->has_init = 1; |
| @@ -400,20 +416,9 @@ handle_modversions(struct module *mod, struct elf_info *info, | |||
| 400 | } | 416 | } |
| 401 | } | 417 | } |
| 402 | 418 | ||
| 403 | int | 419 | /** |
| 404 | is_vmlinux(const char *modname) | 420 | * Parse tag=value strings from .modinfo section |
| 405 | { | 421 | **/ |
| 406 | const char *myname; | ||
| 407 | |||
| 408 | if ((myname = strrchr(modname, '/'))) | ||
| 409 | myname++; | ||
| 410 | else | ||
| 411 | myname = modname; | ||
| 412 | |||
| 413 | return strcmp(myname, "vmlinux") == 0; | ||
| 414 | } | ||
| 415 | |||
| 416 | /* Parse tag=value strings from .modinfo section */ | ||
| 417 | static char *next_string(char *string, unsigned long *secsize) | 422 | static char *next_string(char *string, unsigned long *secsize) |
| 418 | { | 423 | { |
| 419 | /* Skip non-zero chars */ | 424 | /* Skip non-zero chars */ |
| @@ -446,8 +451,418 @@ static char *get_modinfo(void *modinfo, unsigned long modinfo_len, | |||
| 446 | return NULL; | 451 | return NULL; |
| 447 | } | 452 | } |
| 448 | 453 | ||
| 449 | void | 454 | /** |
| 450 | read_symbols(char *modname) | 455 | * Test if string s ends in string sub |
| 456 | * return 0 if match | ||
| 457 | **/ | ||
| 458 | static int strrcmp(const char *s, const char *sub) | ||
| 459 | { | ||
| 460 | int slen, sublen; | ||
| 461 | |||
| 462 | if (!s || !sub) | ||
| 463 | return 1; | ||
| 464 | |||
| 465 | slen = strlen(s); | ||
| 466 | sublen = strlen(sub); | ||
| 467 | |||
| 468 | if ((slen == 0) || (sublen == 0)) | ||
| 469 | return 1; | ||
| 470 | |||
| 471 | if (sublen > slen) | ||
| 472 | return 1; | ||
| 473 | |||
| 474 | return memcmp(s + slen - sublen, sub, sublen); | ||
| 475 | } | ||
| 476 | |||
| 477 | /** | ||
| 478 | * Whitelist to allow certain references to pass with no warning. | ||
| 479 | * Pattern 1: | ||
| 480 | * If a module parameter is declared __initdata and permissions=0 | ||
| 481 | * then this is legal despite the warning generated. | ||
| 482 | * We cannot see value of permissions here, so just ignore | ||
| 483 | * this pattern. | ||
| 484 | * The pattern is identified by: | ||
| 485 | * tosec = .init.data | ||
| 486 | * fromsec = .data* | ||
| 487 | * atsym =__param* | ||
| 488 | * | ||
| 489 | * Pattern 2: | ||
| 490 | * Many drivers utilise a *_driver container with references to | ||
| 491 | * add, remove, probe functions etc. | ||
| 492 | * These functions may often be marked __init and we do not want to | ||
| 493 | * warn here. | ||
| 494 | * the pattern is identified by: | ||
| 495 | * tosec = .init.text | .exit.text | ||
| 496 | * fromsec = .data | ||
| 497 | * atsym = *_driver, *_ops, *_probe, *probe_one | ||
| 498 | **/ | ||
| 499 | static int secref_whitelist(const char *tosec, const char *fromsec, | ||
| 500 | const char *atsym) | ||
| 501 | { | ||
| 502 | int f1 = 1, f2 = 1; | ||
| 503 | const char **s; | ||
| 504 | const char *pat2sym[] = { | ||
| 505 | "_driver", | ||
| 506 | "_ops", | ||
| 507 | "_probe", | ||
| 508 | "_probe_one", | ||
| 509 | NULL | ||
| 510 | }; | ||
| 511 | |||
| 512 | /* Check for pattern 1 */ | ||
| 513 | if (strcmp(tosec, ".init.data") != 0) | ||
| 514 | f1 = 0; | ||
| 515 | if (strncmp(fromsec, ".data", strlen(".data")) != 0) | ||
| 516 | f1 = 0; | ||
| 517 | if (strncmp(atsym, "__param", strlen("__param")) != 0) | ||
| 518 | f1 = 0; | ||
| 519 | |||
| 520 | if (f1) | ||
| 521 | return f1; | ||
| 522 | |||
| 523 | /* Check for pattern 2 */ | ||
| 524 | if ((strcmp(tosec, ".init.text") != 0) && | ||
| 525 | (strcmp(tosec, ".exit.text") != 0)) | ||
| 526 | f2 = 0; | ||
| 527 | if (strcmp(fromsec, ".data") != 0) | ||
| 528 | f2 = 0; | ||
| 529 | |||
| 530 | for (s = pat2sym; *s; s++) | ||
| 531 | if (strrcmp(atsym, *s) == 0) | ||
| 532 | f1 = 1; | ||
| 533 | |||
| 534 | return f1 && f2; | ||
| 535 | } | ||
| 536 | |||
| 537 | /** | ||
| 538 | * Find symbol based on relocation record info. | ||
| 539 | * In some cases the symbol supplied is a valid symbol so | ||
| 540 | * return refsym. If st_name != 0 we assume this is a valid symbol. | ||
| 541 | * In other cases the symbol needs to be looked up in the symbol table | ||
| 542 | * based on section and address. | ||
| 543 | * **/ | ||
| 544 | static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr, | ||
| 545 | Elf_Sym *relsym) | ||
| 546 | { | ||
| 547 | Elf_Sym *sym; | ||
| 548 | |||
| 549 | if (relsym->st_name != 0) | ||
| 550 | return relsym; | ||
| 551 | for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) { | ||
| 552 | if (sym->st_shndx != relsym->st_shndx) | ||
| 553 | continue; | ||
| 554 | if (sym->st_value == addr) | ||
| 555 | return sym; | ||
| 556 | } | ||
| 557 | return NULL; | ||
| 558 | } | ||
| 559 | |||
| 560 | /* | ||
| 561 | * Find symbols before or equal addr and after addr - in the section sec. | ||
| 562 | * If we find two symbols with equal offset prefer one with a valid name. | ||
| 563 | * The ELF format may have a better way to detect what type of symbol | ||
| 564 | * it is, but this works for now. | ||
| 565 | **/ | ||
| 566 | static void find_symbols_between(struct elf_info *elf, Elf_Addr addr, | ||
| 567 | const char *sec, | ||
| 568 | Elf_Sym **before, Elf_Sym **after) | ||
| 569 | { | ||
| 570 | Elf_Sym *sym; | ||
| 571 | Elf_Ehdr *hdr = elf->hdr; | ||
| 572 | Elf_Addr beforediff = ~0; | ||
| 573 | Elf_Addr afterdiff = ~0; | ||
| 574 | const char *secstrings = (void *)hdr + | ||
| 575 | elf->sechdrs[hdr->e_shstrndx].sh_offset; | ||
| 576 | |||
| 577 | *before = NULL; | ||
| 578 | *after = NULL; | ||
| 579 | |||
| 580 | for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) { | ||
| 581 | const char *symsec; | ||
| 582 | |||
| 583 | if (sym->st_shndx >= SHN_LORESERVE) | ||
| 584 | continue; | ||
| 585 | symsec = secstrings + elf->sechdrs[sym->st_shndx].sh_name; | ||
| 586 | if (strcmp(symsec, sec) != 0) | ||
| 587 | continue; | ||
| 588 | if (sym->st_value <= addr) { | ||
| 589 | if ((addr - sym->st_value) < beforediff) { | ||
| 590 | beforediff = addr - sym->st_value; | ||
| 591 | *before = sym; | ||
| 592 | } | ||
| 593 | else if ((addr - sym->st_value) == beforediff) { | ||
| 594 | /* equal offset, valid name? */ | ||
| 595 | const char *name = elf->strtab + sym->st_name; | ||
| 596 | if (name && strlen(name)) | ||
| 597 | *before = sym; | ||
| 598 | } | ||
| 599 | } | ||
| 600 | else | ||
| 601 | { | ||
| 602 | if ((sym->st_value - addr) < afterdiff) { | ||
| 603 | afterdiff = sym->st_value - addr; | ||
| 604 | *after = sym; | ||
| 605 | } | ||
| 606 | else if ((sym->st_value - addr) == afterdiff) { | ||
| 607 | /* equal offset, valid name? */ | ||
| 608 | const char *name = elf->strtab + sym->st_name; | ||
| 609 | if (name && strlen(name)) | ||
| 610 | *after = sym; | ||
| 611 | } | ||
| 612 | } | ||
| 613 | } | ||
| 614 | } | ||
| 615 | |||
| 616 | /** | ||
| 617 | * Print a warning about a section mismatch. | ||
| 618 | * Try to find symbols near it so user can find it. | ||
| 619 | * Check whitelist before warning - it may be a false positive. | ||
| 620 | **/ | ||
| 621 | static void warn_sec_mismatch(const char *modname, const char *fromsec, | ||
| 622 | struct elf_info *elf, Elf_Sym *sym, Elf_Rela r) | ||
| 623 | { | ||
| 624 | const char *refsymname = ""; | ||
| 625 | Elf_Sym *before, *after; | ||
| 626 | Elf_Sym *refsym; | ||
| 627 | Elf_Ehdr *hdr = elf->hdr; | ||
| 628 | Elf_Shdr *sechdrs = elf->sechdrs; | ||
| 629 | const char *secstrings = (void *)hdr + | ||
| 630 | sechdrs[hdr->e_shstrndx].sh_offset; | ||
| 631 | const char *secname = secstrings + sechdrs[sym->st_shndx].sh_name; | ||
| 632 | |||
| 633 | find_symbols_between(elf, r.r_offset, fromsec, &before, &after); | ||
| 634 | |||
| 635 | refsym = find_elf_symbol(elf, r.r_addend, sym); | ||
| 636 | if (refsym && strlen(elf->strtab + refsym->st_name)) | ||
| 637 | refsymname = elf->strtab + refsym->st_name; | ||
| 638 | |||
| 639 | /* check whitelist - we may ignore it */ | ||
| 640 | if (before && | ||
| 641 | secref_whitelist(secname, fromsec, elf->strtab + before->st_name)) | ||
| 642 | return; | ||
| 643 | |||
| 644 | if (before && after) { | ||
| 645 | warn("%s - Section mismatch: reference to %s:%s from %s " | ||
| 646 | "between '%s' (at offset 0x%llx) and '%s'\n", | ||
| 647 | modname, secname, refsymname, fromsec, | ||
| 648 | elf->strtab + before->st_name, | ||
| 649 | (long long)r.r_offset, | ||
| 650 | elf->strtab + after->st_name); | ||
| 651 | } else if (before) { | ||
| 652 | warn("%s - Section mismatch: reference to %s:%s from %s " | ||
| 653 | "after '%s' (at offset 0x%llx)\n", | ||
| 654 | modname, secname, refsymname, fromsec, | ||
| 655 | elf->strtab + before->st_name, | ||
| 656 | (long long)r.r_offset); | ||
| 657 | } else if (after) { | ||
| 658 | warn("%s - Section mismatch: reference to %s:%s from %s " | ||
| 659 | "before '%s' (at offset -0x%llx)\n", | ||
| 660 | modname, secname, refsymname, fromsec, | ||
| 661 | elf->strtab + before->st_name, | ||
| 662 | (long long)r.r_offset); | ||
| 663 | } else { | ||
| 664 | warn("%s - Section mismatch: reference to %s:%s from %s " | ||
| 665 | "(offset 0x%llx)\n", | ||
| 666 | modname, secname, fromsec, refsymname, | ||
| 667 | (long long)r.r_offset); | ||
| 668 | } | ||
| 669 | } | ||
| 670 | |||
| 671 | /** | ||
| 672 | * A module includes a number of sections that are discarded | ||
| 673 | * either when loaded or when used as built-in. | ||
| 674 | * For loaded modules all functions marked __init and all data | ||
| 675 | * marked __initdata will be discarded when the module has been intialized. | ||
| 676 | * Likewise for modules used built-in the sections marked __exit | ||
| 677 | * are discarded because __exit marked function are supposed to be called | ||
| 678 | * only when a moduel is unloaded which never happes for built-in modules. | ||
| 679 | * The check_sec_ref() function traverses all relocation records | ||
| 680 | * to find all references to a section that reference a section that will | ||
| 681 | * be discarded and warns about it. | ||
| 682 | **/ | ||
| 683 | static void check_sec_ref(struct module *mod, const char *modname, | ||
| 684 | struct elf_info *elf, | ||
| 685 | int section(const char*), | ||
| 686 | int section_ref_ok(const char *)) | ||
| 687 | { | ||
| 688 | int i; | ||
| 689 | Elf_Sym *sym; | ||
| 690 | Elf_Ehdr *hdr = elf->hdr; | ||
| 691 | Elf_Shdr *sechdrs = elf->sechdrs; | ||
| 692 | const char *secstrings = (void *)hdr + | ||
| 693 | sechdrs[hdr->e_shstrndx].sh_offset; | ||
| 694 | |||
| 695 | /* Walk through all sections */ | ||
| 696 | for (i = 0; i < hdr->e_shnum; i++) { | ||
| 697 | Elf_Rela *rela; | ||
| 698 | Elf_Rela *start = (void *)hdr + sechdrs[i].sh_offset; | ||
| 699 | Elf_Rela *stop = (void*)start + sechdrs[i].sh_size; | ||
| 700 | const char *name = secstrings + sechdrs[i].sh_name + | ||
| 701 | strlen(".rela"); | ||
| 702 | /* We want to process only relocation sections and not .init */ | ||
| 703 | if (section_ref_ok(name) || (sechdrs[i].sh_type != SHT_RELA)) | ||
| 704 | continue; | ||
| 705 | |||
| 706 | for (rela = start; rela < stop; rela++) { | ||
| 707 | Elf_Rela r; | ||
| 708 | const char *secname; | ||
| 709 | r.r_offset = TO_NATIVE(rela->r_offset); | ||
| 710 | r.r_info = TO_NATIVE(rela->r_info); | ||
| 711 | r.r_addend = TO_NATIVE(rela->r_addend); | ||
| 712 | sym = elf->symtab_start + ELF_R_SYM(r.r_info); | ||
| 713 | /* Skip special sections */ | ||
| 714 | if (sym->st_shndx >= SHN_LORESERVE) | ||
| 715 | continue; | ||
| 716 | |||
| 717 | secname = secstrings + sechdrs[sym->st_shndx].sh_name; | ||
| 718 | if (section(secname)) | ||
| 719 | warn_sec_mismatch(modname, name, elf, sym, r); | ||
| 720 | } | ||
| 721 | } | ||
| 722 | } | ||
| 723 | |||
| 724 | /** | ||
| 725 | * Functions used only during module init is marked __init and is stored in | ||
| 726 | * a .init.text section. Likewise data is marked __initdata and stored in | ||
| 727 | * a .init.data section. | ||
| 728 | * If this section is one of these sections return 1 | ||
| 729 | * See include/linux/init.h for the details | ||
| 730 | **/ | ||
| 731 | static int init_section(const char *name) | ||
| 732 | { | ||
| 733 | if (strcmp(name, ".init") == 0) | ||
| 734 | return 1; | ||
| 735 | if (strncmp(name, ".init.", strlen(".init.")) == 0) | ||
| 736 | return 1; | ||
| 737 | return 0; | ||
| 738 | } | ||
| 739 | |||
| 740 | /** | ||
| 741 | * Identify sections from which references to a .init section is OK. | ||
| 742 | * | ||
| 743 | * Unfortunately references to read only data that referenced .init | ||
| 744 | * sections had to be excluded. Almost all of these are false | ||
| 745 | * positives, they are created by gcc. The downside of excluding rodata | ||
| 746 | * is that there really are some user references from rodata to | ||
| 747 | * init code, e.g. drivers/video/vgacon.c: | ||
| 748 | * | ||
| 749 | * const struct consw vga_con = { | ||
| 750 | * con_startup: vgacon_startup, | ||
| 751 | * | ||
| 752 | * where vgacon_startup is __init. If you want to wade through the false | ||
| 753 | * positives, take out the check for rodata. | ||
| 754 | **/ | ||
| 755 | static int init_section_ref_ok(const char *name) | ||
| 756 | { | ||
| 757 | const char **s; | ||
| 758 | /* Absolute section names */ | ||
| 759 | const char *namelist1[] = { | ||
| 760 | ".init", | ||
| 761 | ".opd", /* see comment [OPD] at exit_section_ref_ok() */ | ||
| 762 | ".toc1", /* used by ppc64 */ | ||
| 763 | ".stab", | ||
| 764 | ".rodata", | ||
| 765 | ".text.lock", | ||
| 766 | "__bug_table", /* used by powerpc for BUG() */ | ||
| 767 | ".pci_fixup_header", | ||
| 768 | ".pci_fixup_final", | ||
| 769 | ".pdr", | ||
| 770 | "__param", | ||
| 771 | NULL | ||
| 772 | }; | ||
| 773 | /* Start of section names */ | ||
| 774 | const char *namelist2[] = { | ||
| 775 | ".init.", | ||
| 776 | ".altinstructions", | ||
| 777 | ".eh_frame", | ||
| 778 | ".debug", | ||
| 779 | NULL | ||
| 780 | }; | ||
| 781 | /* part of section name */ | ||
| 782 | const char *namelist3 [] = { | ||
| 783 | ".unwind", /* sample: IA_64.unwind.init.text */ | ||
| 784 | NULL | ||
| 785 | }; | ||
| 786 | |||
| 787 | for (s = namelist1; *s; s++) | ||
| 788 | if (strcmp(*s, name) == 0) | ||
| 789 | return 1; | ||
| 790 | for (s = namelist2; *s; s++) | ||
| 791 | if (strncmp(*s, name, strlen(*s)) == 0) | ||
| 792 | return 1; | ||
| 793 | for (s = namelist3; *s; s++) | ||
| 794 | if (strstr(name, *s) != NULL) | ||
| 795 | return 1; | ||
| 796 | return 0; | ||
| 797 | } | ||
| 798 | |||
| 799 | /* | ||
| 800 | * Functions used only during module exit is marked __exit and is stored in | ||
| 801 | * a .exit.text section. Likewise data is marked __exitdata and stored in | ||
| 802 | * a .exit.data section. | ||
| 803 | * If this section is one of these sections return 1 | ||
| 804 | * See include/linux/init.h for the details | ||
| 805 | **/ | ||
| 806 | static int exit_section(const char *name) | ||
| 807 | { | ||
| 808 | if (strcmp(name, ".exit.text") == 0) | ||
| 809 | return 1; | ||
| 810 | if (strcmp(name, ".exit.data") == 0) | ||
| 811 | return 1; | ||
| 812 | return 0; | ||
| 813 | |||
| 814 | } | ||
| 815 | |||
| 816 | /* | ||
| 817 | * Identify sections from which references to a .exit section is OK. | ||
| 818 | * | ||
| 819 | * [OPD] Keith Ownes <kaos@sgi.com> commented: | ||
| 820 | * For our future {in}sanity, add a comment that this is the ppc .opd | ||
| 821 | * section, not the ia64 .opd section. | ||
| 822 | * ia64 .opd should not point to discarded sections. | ||
| 823 | **/ | ||
| 824 | static int exit_section_ref_ok(const char *name) | ||
| 825 | { | ||
| 826 | const char **s; | ||
| 827 | /* Absolute section names */ | ||
| 828 | const char *namelist1[] = { | ||
| 829 | ".exit.text", | ||
| 830 | ".exit.data", | ||
| 831 | ".init.text", | ||
| 832 | ".opd", /* See comment [OPD] */ | ||
| 833 | ".toc1", /* used by ppc64 */ | ||
| 834 | ".altinstructions", | ||
| 835 | ".pdr", | ||
| 836 | "__bug_table", /* used by powerpc for BUG() */ | ||
| 837 | ".exitcall.exit", | ||
| 838 | ".eh_frame", | ||
| 839 | ".stab", | ||
| 840 | NULL | ||
| 841 | }; | ||
| 842 | /* Start of section names */ | ||
| 843 | const char *namelist2[] = { | ||
| 844 | ".debug", | ||
| 845 | NULL | ||
| 846 | }; | ||
| 847 | /* part of section name */ | ||
| 848 | const char *namelist3 [] = { | ||
| 849 | ".unwind", /* Sample: IA_64.unwind.exit.text */ | ||
| 850 | NULL | ||
| 851 | }; | ||
| 852 | |||
| 853 | for (s = namelist1; *s; s++) | ||
| 854 | if (strcmp(*s, name) == 0) | ||
| 855 | return 1; | ||
| 856 | for (s = namelist2; *s; s++) | ||
| 857 | if (strncmp(*s, name, strlen(*s)) == 0) | ||
| 858 | return 1; | ||
| 859 | for (s = namelist3; *s; s++) | ||
| 860 | if (strstr(name, *s) != NULL) | ||
| 861 | return 1; | ||
| 862 | return 0; | ||
| 863 | } | ||
| 864 | |||
| 865 | static void read_symbols(char *modname) | ||
| 451 | { | 866 | { |
| 452 | const char *symname; | 867 | const char *symname; |
| 453 | char *version; | 868 | char *version; |
| @@ -462,9 +877,7 @@ read_symbols(char *modname) | |||
| 462 | /* When there's no vmlinux, don't print warnings about | 877 | /* When there's no vmlinux, don't print warnings about |
| 463 | * unresolved symbols (since there'll be too many ;) */ | 878 | * unresolved symbols (since there'll be too many ;) */ |
| 464 | if (is_vmlinux(modname)) { | 879 | if (is_vmlinux(modname)) { |
| 465 | unsigned int fake_crc = 0; | ||
| 466 | have_vmlinux = 1; | 880 | have_vmlinux = 1; |
| 467 | add_exported_symbol("struct_module", mod, &fake_crc); | ||
| 468 | mod->skip = 1; | 881 | mod->skip = 1; |
| 469 | } | 882 | } |
| 470 | 883 | ||
| @@ -474,6 +887,8 @@ read_symbols(char *modname) | |||
| 474 | handle_modversions(mod, &info, sym, symname); | 887 | handle_modversions(mod, &info, sym, symname); |
| 475 | handle_moddevtable(mod, &info, sym, symname); | 888 | handle_moddevtable(mod, &info, sym, symname); |
| 476 | } | 889 | } |
| 890 | check_sec_ref(mod, modname, &info, init_section, init_section_ref_ok); | ||
| 891 | check_sec_ref(mod, modname, &info, exit_section, exit_section_ref_ok); | ||
| 477 | 892 | ||
| 478 | version = get_modinfo(info.modinfo, info.modinfo_len, "version"); | 893 | version = get_modinfo(info.modinfo, info.modinfo_len, "version"); |
| 479 | if (version) | 894 | if (version) |
| @@ -499,21 +914,20 @@ read_symbols(char *modname) | |||
| 499 | * following helper, then compare to the file on disk and | 914 | * following helper, then compare to the file on disk and |
| 500 | * only update the later if anything changed */ | 915 | * only update the later if anything changed */ |
| 501 | 916 | ||
| 502 | void __attribute__((format(printf, 2, 3))) | 917 | void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf, |
| 503 | buf_printf(struct buffer *buf, const char *fmt, ...) | 918 | const char *fmt, ...) |
| 504 | { | 919 | { |
| 505 | char tmp[SZ]; | 920 | char tmp[SZ]; |
| 506 | int len; | 921 | int len; |
| 507 | va_list ap; | 922 | va_list ap; |
| 508 | 923 | ||
| 509 | va_start(ap, fmt); | 924 | va_start(ap, fmt); |
| 510 | len = vsnprintf(tmp, SZ, fmt, ap); | 925 | len = vsnprintf(tmp, SZ, fmt, ap); |
| 511 | buf_write(buf, tmp, len); | 926 | buf_write(buf, tmp, len); |
| 512 | va_end(ap); | 927 | va_end(ap); |
| 513 | } | 928 | } |
| 514 | 929 | ||
| 515 | void | 930 | void buf_write(struct buffer *buf, const char *s, int len) |
| 516 | buf_write(struct buffer *buf, const char *s, int len) | ||
| 517 | { | 931 | { |
| 518 | if (buf->size - buf->pos < len) { | 932 | if (buf->size - buf->pos < len) { |
| 519 | buf->size += len + SZ; | 933 | buf->size += len + SZ; |
| @@ -523,10 +937,10 @@ buf_write(struct buffer *buf, const char *s, int len) | |||
| 523 | buf->pos += len; | 937 | buf->pos += len; |
| 524 | } | 938 | } |
| 525 | 939 | ||
| 526 | /* Header for the generated file */ | 940 | /** |
| 527 | 941 | * Header for the generated file | |
| 528 | void | 942 | **/ |
| 529 | add_header(struct buffer *b, struct module *mod) | 943 | static void add_header(struct buffer *b, struct module *mod) |
| 530 | { | 944 | { |
| 531 | buf_printf(b, "#include <linux/module.h>\n"); | 945 | buf_printf(b, "#include <linux/module.h>\n"); |
| 532 | buf_printf(b, "#include <linux/vermagic.h>\n"); | 946 | buf_printf(b, "#include <linux/vermagic.h>\n"); |
| @@ -546,10 +960,10 @@ add_header(struct buffer *b, struct module *mod) | |||
| 546 | buf_printf(b, "};\n"); | 960 | buf_printf(b, "};\n"); |
| 547 | } | 961 | } |
| 548 | 962 | ||
| 549 | /* Record CRCs for unresolved symbols */ | 963 | /** |
| 550 | 964 | * Record CRCs for unresolved symbols | |
| 551 | void | 965 | **/ |
| 552 | add_versions(struct buffer *b, struct module *mod) | 966 | static void add_versions(struct buffer *b, struct module *mod) |
| 553 | { | 967 | { |
| 554 | struct symbol *s, *exp; | 968 | struct symbol *s, *exp; |
| 555 | 969 | ||
| @@ -557,8 +971,8 @@ add_versions(struct buffer *b, struct module *mod) | |||
| 557 | exp = find_symbol(s->name); | 971 | exp = find_symbol(s->name); |
| 558 | if (!exp || exp->module == mod) { | 972 | if (!exp || exp->module == mod) { |
| 559 | if (have_vmlinux && !s->weak) | 973 | if (have_vmlinux && !s->weak) |
| 560 | fprintf(stderr, "*** Warning: \"%s\" [%s.ko] " | 974 | warn("\"%s\" [%s.ko] undefined!\n", |
| 561 | "undefined!\n", s->name, mod->name); | 975 | s->name, mod->name); |
| 562 | continue; | 976 | continue; |
| 563 | } | 977 | } |
| 564 | s->module = exp->module; | 978 | s->module = exp->module; |
| @@ -579,8 +993,7 @@ add_versions(struct buffer *b, struct module *mod) | |||
| 579 | continue; | 993 | continue; |
| 580 | } | 994 | } |
| 581 | if (!s->crc_valid) { | 995 | if (!s->crc_valid) { |
| 582 | fprintf(stderr, "*** Warning: \"%s\" [%s.ko] " | 996 | warn("\"%s\" [%s.ko] has no CRC!\n", |
| 583 | "has no CRC!\n", | ||
| 584 | s->name, mod->name); | 997 | s->name, mod->name); |
| 585 | continue; | 998 | continue; |
| 586 | } | 999 | } |
| @@ -590,8 +1003,8 @@ add_versions(struct buffer *b, struct module *mod) | |||
| 590 | buf_printf(b, "};\n"); | 1003 | buf_printf(b, "};\n"); |
| 591 | } | 1004 | } |
| 592 | 1005 | ||
| 593 | void | 1006 | static void add_depends(struct buffer *b, struct module *mod, |
| 594 | add_depends(struct buffer *b, struct module *mod, struct module *modules) | 1007 | struct module *modules) |
| 595 | { | 1008 | { |
| 596 | struct symbol *s; | 1009 | struct symbol *s; |
| 597 | struct module *m; | 1010 | struct module *m; |
| @@ -621,8 +1034,7 @@ add_depends(struct buffer *b, struct module *mod, struct module *modules) | |||
| 621 | buf_printf(b, "\";\n"); | 1034 | buf_printf(b, "\";\n"); |
| 622 | } | 1035 | } |
| 623 | 1036 | ||
| 624 | void | 1037 | static void add_srcversion(struct buffer *b, struct module *mod) |
| 625 | add_srcversion(struct buffer *b, struct module *mod) | ||
| 626 | { | 1038 | { |
| 627 | if (mod->srcversion[0]) { | 1039 | if (mod->srcversion[0]) { |
| 628 | buf_printf(b, "\n"); | 1040 | buf_printf(b, "\n"); |
| @@ -631,8 +1043,7 @@ add_srcversion(struct buffer *b, struct module *mod) | |||
| 631 | } | 1043 | } |
| 632 | } | 1044 | } |
| 633 | 1045 | ||
| 634 | void | 1046 | static void write_if_changed(struct buffer *b, const char *fname) |
| 635 | write_if_changed(struct buffer *b, const char *fname) | ||
| 636 | { | 1047 | { |
| 637 | char *tmp; | 1048 | char *tmp; |
| 638 | FILE *file; | 1049 | FILE *file; |
| @@ -676,8 +1087,7 @@ write_if_changed(struct buffer *b, const char *fname) | |||
| 676 | fclose(file); | 1087 | fclose(file); |
| 677 | } | 1088 | } |
| 678 | 1089 | ||
| 679 | void | 1090 | static void read_dump(const char *fname, unsigned int kernel) |
| 680 | read_dump(const char *fname) | ||
| 681 | { | 1091 | { |
| 682 | unsigned long size, pos = 0; | 1092 | unsigned long size, pos = 0; |
| 683 | void *file = grab_file(fname, &size); | 1093 | void *file = grab_file(fname, &size); |
| @@ -691,6 +1101,7 @@ read_dump(const char *fname) | |||
| 691 | char *symname, *modname, *d; | 1101 | char *symname, *modname, *d; |
| 692 | unsigned int crc; | 1102 | unsigned int crc; |
| 693 | struct module *mod; | 1103 | struct module *mod; |
| 1104 | struct symbol *s; | ||
| 694 | 1105 | ||
| 695 | if (!(symname = strchr(line, '\t'))) | 1106 | if (!(symname = strchr(line, '\t'))) |
| 696 | goto fail; | 1107 | goto fail; |
| @@ -711,15 +1122,30 @@ read_dump(const char *fname) | |||
| 711 | mod = new_module(NOFAIL(strdup(modname))); | 1122 | mod = new_module(NOFAIL(strdup(modname))); |
| 712 | mod->skip = 1; | 1123 | mod->skip = 1; |
| 713 | } | 1124 | } |
| 714 | add_exported_symbol(symname, mod, &crc); | 1125 | s = sym_add_exported(symname, mod); |
| 1126 | s->kernel = kernel; | ||
| 1127 | s->preloaded = 1; | ||
| 1128 | sym_update_crc(symname, mod, crc); | ||
| 715 | } | 1129 | } |
| 716 | return; | 1130 | return; |
| 717 | fail: | 1131 | fail: |
| 718 | fatal("parse error in symbol dump file\n"); | 1132 | fatal("parse error in symbol dump file\n"); |
| 719 | } | 1133 | } |
| 720 | 1134 | ||
| 721 | void | 1135 | /* For normal builds always dump all symbols. |
| 722 | write_dump(const char *fname) | 1136 | * For external modules only dump symbols |
| 1137 | * that are not read from kernel Module.symvers. | ||
| 1138 | **/ | ||
| 1139 | static int dump_sym(struct symbol *sym) | ||
| 1140 | { | ||
| 1141 | if (!external_module) | ||
| 1142 | return 1; | ||
| 1143 | if (sym->vmlinux || sym->kernel) | ||
| 1144 | return 0; | ||
| 1145 | return 1; | ||
| 1146 | } | ||
| 1147 | |||
| 1148 | static void write_dump(const char *fname) | ||
| 723 | { | 1149 | { |
| 724 | struct buffer buf = { }; | 1150 | struct buffer buf = { }; |
| 725 | struct symbol *symbol; | 1151 | struct symbol *symbol; |
| @@ -728,34 +1154,33 @@ write_dump(const char *fname) | |||
| 728 | for (n = 0; n < SYMBOL_HASH_SIZE ; n++) { | 1154 | for (n = 0; n < SYMBOL_HASH_SIZE ; n++) { |
| 729 | symbol = symbolhash[n]; | 1155 | symbol = symbolhash[n]; |
| 730 | while (symbol) { | 1156 | while (symbol) { |
| 731 | symbol = symbol->next; | 1157 | if (dump_sym(symbol)) |
| 732 | } | 1158 | buf_printf(&buf, "0x%08x\t%s\t%s\n", |
| 733 | } | 1159 | symbol->crc, symbol->name, |
| 734 | 1160 | symbol->module->name); | |
| 735 | for (n = 0; n < SYMBOL_HASH_SIZE ; n++) { | ||
| 736 | symbol = symbolhash[n]; | ||
| 737 | while (symbol) { | ||
| 738 | buf_printf(&buf, "0x%08x\t%s\t%s\n", symbol->crc, | ||
| 739 | symbol->name, symbol->module->name); | ||
| 740 | symbol = symbol->next; | 1161 | symbol = symbol->next; |
| 741 | } | 1162 | } |
| 742 | } | 1163 | } |
| 743 | write_if_changed(&buf, fname); | 1164 | write_if_changed(&buf, fname); |
| 744 | } | 1165 | } |
| 745 | 1166 | ||
| 746 | int | 1167 | int main(int argc, char **argv) |
| 747 | main(int argc, char **argv) | ||
| 748 | { | 1168 | { |
| 749 | struct module *mod; | 1169 | struct module *mod; |
| 750 | struct buffer buf = { }; | 1170 | struct buffer buf = { }; |
| 751 | char fname[SZ]; | 1171 | char fname[SZ]; |
| 752 | char *dump_read = NULL, *dump_write = NULL; | 1172 | char *kernel_read = NULL, *module_read = NULL; |
| 1173 | char *dump_write = NULL; | ||
| 753 | int opt; | 1174 | int opt; |
| 754 | 1175 | ||
| 755 | while ((opt = getopt(argc, argv, "i:mo:a")) != -1) { | 1176 | while ((opt = getopt(argc, argv, "i:I:mo:a")) != -1) { |
| 756 | switch(opt) { | 1177 | switch(opt) { |
| 757 | case 'i': | 1178 | case 'i': |
| 758 | dump_read = optarg; | 1179 | kernel_read = optarg; |
| 1180 | break; | ||
| 1181 | case 'I': | ||
| 1182 | module_read = optarg; | ||
| 1183 | external_module = 1; | ||
| 759 | break; | 1184 | break; |
| 760 | case 'm': | 1185 | case 'm': |
| 761 | modversions = 1; | 1186 | modversions = 1; |
| @@ -771,8 +1196,10 @@ main(int argc, char **argv) | |||
| 771 | } | 1196 | } |
| 772 | } | 1197 | } |
| 773 | 1198 | ||
| 774 | if (dump_read) | 1199 | if (kernel_read) |
| 775 | read_dump(dump_read); | 1200 | read_dump(kernel_read, 1); |
| 1201 | if (module_read) | ||
| 1202 | read_dump(module_read, 0); | ||
| 776 | 1203 | ||
| 777 | while (optind < argc) { | 1204 | while (optind < argc) { |
| 778 | read_symbols(argv[optind++]); | 1205 | read_symbols(argv[optind++]); |
| @@ -799,4 +1226,3 @@ main(int argc, char **argv) | |||
| 799 | 1226 | ||
| 800 | return 0; | 1227 | return 0; |
| 801 | } | 1228 | } |
| 802 | |||
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index 7334d839145d..b14255c72a37 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h | |||
| @@ -13,20 +13,30 @@ | |||
| 13 | 13 | ||
| 14 | #if KERNEL_ELFCLASS == ELFCLASS32 | 14 | #if KERNEL_ELFCLASS == ELFCLASS32 |
| 15 | 15 | ||
| 16 | #define Elf_Ehdr Elf32_Ehdr | 16 | #define Elf_Ehdr Elf32_Ehdr |
| 17 | #define Elf_Shdr Elf32_Shdr | 17 | #define Elf_Shdr Elf32_Shdr |
| 18 | #define Elf_Sym Elf32_Sym | 18 | #define Elf_Sym Elf32_Sym |
| 19 | #define Elf_Addr Elf32_Addr | ||
| 20 | #define Elf_Section Elf32_Section | ||
| 19 | #define ELF_ST_BIND ELF32_ST_BIND | 21 | #define ELF_ST_BIND ELF32_ST_BIND |
| 20 | #define ELF_ST_TYPE ELF32_ST_TYPE | 22 | #define ELF_ST_TYPE ELF32_ST_TYPE |
| 21 | 23 | ||
| 24 | #define Elf_Rela Elf32_Rela | ||
| 25 | #define ELF_R_SYM ELF32_R_SYM | ||
| 26 | #define ELF_R_TYPE ELF32_R_TYPE | ||
| 22 | #else | 27 | #else |
| 23 | 28 | ||
| 24 | #define Elf_Ehdr Elf64_Ehdr | 29 | #define Elf_Ehdr Elf64_Ehdr |
| 25 | #define Elf_Shdr Elf64_Shdr | 30 | #define Elf_Shdr Elf64_Shdr |
| 26 | #define Elf_Sym Elf64_Sym | 31 | #define Elf_Sym Elf64_Sym |
| 32 | #define Elf_Addr Elf64_Addr | ||
| 33 | #define Elf_Section Elf64_Section | ||
| 27 | #define ELF_ST_BIND ELF64_ST_BIND | 34 | #define ELF_ST_BIND ELF64_ST_BIND |
| 28 | #define ELF_ST_TYPE ELF64_ST_TYPE | 35 | #define ELF_ST_TYPE ELF64_ST_TYPE |
| 29 | 36 | ||
| 37 | #define Elf_Rela Elf64_Rela | ||
| 38 | #define ELF_R_SYM ELF64_R_SYM | ||
| 39 | #define ELF_R_TYPE ELF64_R_TYPE | ||
| 30 | #endif | 40 | #endif |
| 31 | 41 | ||
| 32 | #if KERNEL_ELFDATA != HOST_ELFDATA | 42 | #if KERNEL_ELFDATA != HOST_ELFDATA |
| @@ -91,17 +101,22 @@ struct elf_info { | |||
| 91 | unsigned int modinfo_len; | 101 | unsigned int modinfo_len; |
| 92 | }; | 102 | }; |
| 93 | 103 | ||
| 104 | /* file2alias.c */ | ||
| 94 | void handle_moddevtable(struct module *mod, struct elf_info *info, | 105 | void handle_moddevtable(struct module *mod, struct elf_info *info, |
| 95 | Elf_Sym *sym, const char *symname); | 106 | Elf_Sym *sym, const char *symname); |
| 96 | |||
| 97 | void add_moddevtable(struct buffer *buf, struct module *mod); | 107 | void add_moddevtable(struct buffer *buf, struct module *mod); |
| 98 | 108 | ||
| 109 | /* sumversion.c */ | ||
| 99 | void maybe_frob_rcs_version(const char *modfilename, | 110 | void maybe_frob_rcs_version(const char *modfilename, |
| 100 | char *version, | 111 | char *version, |
| 101 | void *modinfo, | 112 | void *modinfo, |
| 102 | unsigned long modinfo_offset); | 113 | unsigned long modinfo_offset); |
| 103 | void get_src_version(const char *modname, char sum[], unsigned sumlen); | 114 | void get_src_version(const char *modname, char sum[], unsigned sumlen); |
| 104 | 115 | ||
| 116 | /* from modpost.c */ | ||
| 105 | void *grab_file(const char *filename, unsigned long *size); | 117 | void *grab_file(const char *filename, unsigned long *size); |
| 106 | char* get_next_line(unsigned long *pos, void *file, unsigned long size); | 118 | char* get_next_line(unsigned long *pos, void *file, unsigned long size); |
| 107 | void release_file(void *file, unsigned long size); | 119 | void release_file(void *file, unsigned long size); |
| 120 | |||
| 121 | void fatal(const char *fmt, ...); | ||
| 122 | void warn(const char *fmt, ...); | ||
diff --git a/scripts/mod/sumversion.c b/scripts/mod/sumversion.c index 43271a1ca01e..8a2875689e4d 100644 --- a/scripts/mod/sumversion.c +++ b/scripts/mod/sumversion.c | |||
| @@ -316,8 +316,7 @@ static int parse_source_files(const char *objfile, struct md4_ctx *md) | |||
| 316 | 316 | ||
| 317 | file = grab_file(cmd, &flen); | 317 | file = grab_file(cmd, &flen); |
| 318 | if (!file) { | 318 | if (!file) { |
| 319 | fprintf(stderr, "Warning: could not find %s for %s\n", | 319 | warn("could not find %s for %s\n", cmd, objfile); |
| 320 | cmd, objfile); | ||
| 321 | goto out; | 320 | goto out; |
| 322 | } | 321 | } |
| 323 | 322 | ||
| @@ -355,9 +354,8 @@ static int parse_source_files(const char *objfile, struct md4_ctx *md) | |||
| 355 | /* Check if this file is in same dir as objfile */ | 354 | /* Check if this file is in same dir as objfile */ |
| 356 | if ((strstr(line, dir)+strlen(dir)-1) == strrchr(line, '/')) { | 355 | if ((strstr(line, dir)+strlen(dir)-1) == strrchr(line, '/')) { |
| 357 | if (!parse_file(line, md)) { | 356 | if (!parse_file(line, md)) { |
| 358 | fprintf(stderr, | 357 | warn("could not open %s: %s\n", |
| 359 | "Warning: could not open %s: %s\n", | 358 | line, strerror(errno)); |
| 360 | line, strerror(errno)); | ||
| 361 | goto out_file; | 359 | goto out_file; |
| 362 | } | 360 | } |
| 363 | 361 | ||
| @@ -383,8 +381,11 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen) | |||
| 383 | struct md4_ctx md; | 381 | struct md4_ctx md; |
| 384 | char *sources, *end, *fname; | 382 | char *sources, *end, *fname; |
| 385 | const char *basename; | 383 | const char *basename; |
| 386 | char filelist[strlen(getenv("MODVERDIR")) + strlen("/") + | 384 | char filelist[PATH_MAX + 1]; |
| 387 | strlen(modname) - strlen(".o") + strlen(".mod") + 1 ]; | 385 | char *modverdir = getenv("MODVERDIR"); |
| 386 | |||
| 387 | if (!modverdir) | ||
| 388 | modverdir = "."; | ||
| 388 | 389 | ||
| 389 | /* Source files for module are in .tmp_versions/modname.mod, | 390 | /* Source files for module are in .tmp_versions/modname.mod, |
| 390 | after the first line. */ | 391 | after the first line. */ |
| @@ -392,28 +393,25 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen) | |||
| 392 | basename = strrchr(modname, '/') + 1; | 393 | basename = strrchr(modname, '/') + 1; |
| 393 | else | 394 | else |
| 394 | basename = modname; | 395 | basename = modname; |
| 395 | sprintf(filelist, "%s/%.*s.mod", getenv("MODVERDIR"), | 396 | sprintf(filelist, "%s/%.*s.mod", modverdir, |
| 396 | (int) strlen(basename) - 2, basename); | 397 | (int) strlen(basename) - 2, basename); |
| 397 | 398 | ||
| 398 | file = grab_file(filelist, &len); | 399 | file = grab_file(filelist, &len); |
| 399 | if (!file) { | 400 | if (!file) { |
| 400 | fprintf(stderr, "Warning: could not find versions for %s\n", | 401 | warn("could not find versions for %s\n", filelist); |
| 401 | filelist); | ||
| 402 | return; | 402 | return; |
| 403 | } | 403 | } |
| 404 | 404 | ||
| 405 | sources = strchr(file, '\n'); | 405 | sources = strchr(file, '\n'); |
| 406 | if (!sources) { | 406 | if (!sources) { |
| 407 | fprintf(stderr, "Warning: malformed versions file for %s\n", | 407 | warn("malformed versions file for %s\n", modname); |
| 408 | modname); | ||
| 409 | goto release; | 408 | goto release; |
| 410 | } | 409 | } |
| 411 | 410 | ||
| 412 | sources++; | 411 | sources++; |
| 413 | end = strchr(sources, '\n'); | 412 | end = strchr(sources, '\n'); |
| 414 | if (!end) { | 413 | if (!end) { |
| 415 | fprintf(stderr, "Warning: bad ending versions file for %s\n", | 414 | warn("bad ending versions file for %s\n", modname); |
| 416 | modname); | ||
| 417 | goto release; | 415 | goto release; |
| 418 | } | 416 | } |
| 419 | *end = '\0'; | 417 | *end = '\0'; |
| @@ -438,19 +436,19 @@ static void write_version(const char *filename, const char *sum, | |||
| 438 | 436 | ||
| 439 | fd = open(filename, O_RDWR); | 437 | fd = open(filename, O_RDWR); |
| 440 | if (fd < 0) { | 438 | if (fd < 0) { |
| 441 | fprintf(stderr, "Warning: changing sum in %s failed: %s\n", | 439 | warn("changing sum in %s failed: %s\n", |
| 442 | filename, strerror(errno)); | 440 | filename, strerror(errno)); |
| 443 | return; | 441 | return; |
| 444 | } | 442 | } |
| 445 | 443 | ||
| 446 | if (lseek(fd, offset, SEEK_SET) == (off_t)-1) { | 444 | if (lseek(fd, offset, SEEK_SET) == (off_t)-1) { |
| 447 | fprintf(stderr, "Warning: changing sum in %s:%lu failed: %s\n", | 445 | warn("changing sum in %s:%lu failed: %s\n", |
| 448 | filename, offset, strerror(errno)); | 446 | filename, offset, strerror(errno)); |
| 449 | goto out; | 447 | goto out; |
| 450 | } | 448 | } |
| 451 | 449 | ||
| 452 | if (write(fd, sum, strlen(sum)+1) != strlen(sum)+1) { | 450 | if (write(fd, sum, strlen(sum)+1) != strlen(sum)+1) { |
| 453 | fprintf(stderr, "Warning: writing sum in %s failed: %s\n", | 451 | warn("writing sum in %s failed: %s\n", |
| 454 | filename, strerror(errno)); | 452 | filename, strerror(errno)); |
| 455 | goto out; | 453 | goto out; |
| 456 | } | 454 | } |
diff --git a/scripts/namespace.pl b/scripts/namespace.pl index 88e30e82f1ca..f34373853ef8 100644 --- a/scripts/namespace.pl +++ b/scripts/namespace.pl | |||
| @@ -66,8 +66,8 @@ require 5; # at least perl 5 | |||
| 66 | use strict; | 66 | use strict; |
| 67 | use File::Find; | 67 | use File::Find; |
| 68 | 68 | ||
| 69 | my $nm = "/usr/bin/nm -p"; | 69 | my $nm = ($ENV{'NM'} || "nm") . " -p"; |
| 70 | my $objdump = "/usr/bin/objdump -s -j .comment"; | 70 | my $objdump = ($ENV{'OBJDUMP'} || "objdump") . " -s -j .comment"; |
| 71 | my $srctree = ""; | 71 | my $srctree = ""; |
| 72 | my $objtree = ""; | 72 | my $objtree = ""; |
| 73 | $srctree = "$ENV{'srctree'}/" if (exists($ENV{'srctree'})); | 73 | $srctree = "$ENV{'srctree'}/" if (exists($ENV{'srctree'})); |
diff --git a/scripts/package/Makefile b/scripts/package/Makefile index c201ef001f09..7c434e037e7f 100644 --- a/scripts/package/Makefile +++ b/scripts/package/Makefile | |||
| @@ -32,12 +32,11 @@ MKSPEC := $(srctree)/scripts/package/mkspec | |||
| 32 | PREV := set -e; cd ..; | 32 | PREV := set -e; cd ..; |
| 33 | 33 | ||
| 34 | # rpm-pkg | 34 | # rpm-pkg |
| 35 | .PHONY: rpm-pkg rpm | 35 | # --------------------------------------------------------------------------- |
| 36 | |||
| 37 | $(objtree)/kernel.spec: $(MKSPEC) $(srctree)/Makefile | 36 | $(objtree)/kernel.spec: $(MKSPEC) $(srctree)/Makefile |
| 38 | $(CONFIG_SHELL) $(MKSPEC) > $@ | 37 | $(CONFIG_SHELL) $(MKSPEC) > $@ |
| 39 | 38 | ||
| 40 | rpm-pkg rpm: $(objtree)/kernel.spec | 39 | rpm-pkg rpm: $(objtree)/kernel.spec FORCE |
| 41 | $(MAKE) clean | 40 | $(MAKE) clean |
| 42 | $(PREV) ln -sf $(srctree) $(KERNELPATH) | 41 | $(PREV) ln -sf $(srctree) $(KERNELPATH) |
| 43 | $(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/. | 42 | $(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/. |
| @@ -54,11 +53,11 @@ rpm-pkg rpm: $(objtree)/kernel.spec | |||
| 54 | clean-files := $(objtree)/kernel.spec | 53 | clean-files := $(objtree)/kernel.spec |
| 55 | 54 | ||
| 56 | # binrpm-pkg | 55 | # binrpm-pkg |
| 57 | .PHONY: binrpm-pkg | 56 | # --------------------------------------------------------------------------- |
| 58 | $(objtree)/binkernel.spec: $(MKSPEC) $(srctree)/Makefile | 57 | $(objtree)/binkernel.spec: $(MKSPEC) $(srctree)/Makefile |
| 59 | $(CONFIG_SHELL) $(MKSPEC) prebuilt > $@ | 58 | $(CONFIG_SHELL) $(MKSPEC) prebuilt > $@ |
| 60 | 59 | ||
| 61 | binrpm-pkg: $(objtree)/binkernel.spec | 60 | binrpm-pkg: $(objtree)/binkernel.spec FORCE |
| 62 | $(MAKE) KBUILD_SRC= | 61 | $(MAKE) KBUILD_SRC= |
| 63 | set -e; \ | 62 | set -e; \ |
| 64 | $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version | 63 | $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version |
| @@ -71,9 +70,7 @@ clean-files += $(objtree)/binkernel.spec | |||
| 71 | 70 | ||
| 72 | # Deb target | 71 | # Deb target |
| 73 | # --------------------------------------------------------------------------- | 72 | # --------------------------------------------------------------------------- |
| 74 | # | 73 | deb-pkg: FORCE |
| 75 | .PHONY: deb-pkg | ||
| 76 | deb-pkg: | ||
| 77 | $(MAKE) KBUILD_SRC= | 74 | $(MAKE) KBUILD_SRC= |
| 78 | $(CONFIG_SHELL) $(srctree)/scripts/package/builddeb | 75 | $(CONFIG_SHELL) $(srctree)/scripts/package/builddeb |
| 79 | 76 | ||
| @@ -82,8 +79,7 @@ clean-dirs += $(objtree)/debian/ | |||
| 82 | 79 | ||
| 83 | # tarball targets | 80 | # tarball targets |
| 84 | # --------------------------------------------------------------------------- | 81 | # --------------------------------------------------------------------------- |
| 85 | .PHONY: tar%pkg | 82 | tar%pkg: FORCE |
| 86 | tar%pkg: | ||
| 87 | $(MAKE) KBUILD_SRC= | 83 | $(MAKE) KBUILD_SRC= |
| 88 | $(CONFIG_SHELL) $(srctree)/scripts/package/buildtar $@ | 84 | $(CONFIG_SHELL) $(srctree)/scripts/package/buildtar $@ |
| 89 | 85 | ||
| @@ -92,7 +88,7 @@ clean-dirs += $(objtree)/tar-install/ | |||
| 92 | 88 | ||
| 93 | # Help text displayed when executing 'make help' | 89 | # Help text displayed when executing 'make help' |
| 94 | # --------------------------------------------------------------------------- | 90 | # --------------------------------------------------------------------------- |
| 95 | help: | 91 | help: FORCE |
| 96 | @echo ' rpm-pkg - Build the kernel as an RPM package' | 92 | @echo ' rpm-pkg - Build the kernel as an RPM package' |
| 97 | @echo ' binrpm-pkg - Build an rpm package containing the compiled kernel' | 93 | @echo ' binrpm-pkg - Build an rpm package containing the compiled kernel' |
| 98 | @echo ' and modules' | 94 | @echo ' and modules' |
diff --git a/scripts/reference_discarded.pl b/scripts/reference_discarded.pl deleted file mode 100644 index 4ee6ab2135b3..000000000000 --- a/scripts/reference_discarded.pl +++ /dev/null | |||
| @@ -1,112 +0,0 @@ | |||
| 1 | #!/usr/bin/perl -w | ||
| 2 | # | ||
| 3 | # reference_discarded.pl (C) Keith Owens 2001 <kaos@ocs.com.au> | ||
| 4 | # | ||
| 5 | # Released under GPL V2. | ||
| 6 | # | ||
| 7 | # List dangling references to vmlinux discarded sections. | ||
| 8 | |||
| 9 | use strict; | ||
| 10 | die($0 . " takes no arguments\n") if($#ARGV >= 0); | ||
| 11 | |||
| 12 | my %object; | ||
| 13 | my $object; | ||
| 14 | my $line; | ||
| 15 | my $ignore; | ||
| 16 | my $errorcount; | ||
| 17 | |||
| 18 | $| = 1; | ||
| 19 | |||
| 20 | # printf("Finding objects, "); | ||
| 21 | open(OBJDUMP_LIST, "find . -name '*.o' | xargs objdump -h |") || die "getting objdump list failed"; | ||
| 22 | while (defined($line = <OBJDUMP_LIST>)) { | ||
| 23 | chomp($line); | ||
| 24 | if ($line =~ /:\s+file format/) { | ||
| 25 | ($object = $line) =~ s/:.*//; | ||
| 26 | $object{$object}->{'module'} = 0; | ||
| 27 | $object{$object}->{'size'} = 0; | ||
| 28 | $object{$object}->{'off'} = 0; | ||
| 29 | } | ||
| 30 | if ($line =~ /^\s*\d+\s+\.modinfo\s+/) { | ||
| 31 | $object{$object}->{'module'} = 1; | ||
| 32 | } | ||
| 33 | if ($line =~ /^\s*\d+\s+\.comment\s+/) { | ||
| 34 | ($object{$object}->{'size'}, $object{$object}->{'off'}) = (split(' ', $line))[2,5]; | ||
| 35 | } | ||
| 36 | } | ||
| 37 | close(OBJDUMP_LIST); | ||
| 38 | # printf("%d objects, ", scalar keys(%object)); | ||
| 39 | $ignore = 0; | ||
| 40 | foreach $object (keys(%object)) { | ||
| 41 | if ($object{$object}->{'module'}) { | ||
| 42 | ++$ignore; | ||
| 43 | delete($object{$object}); | ||
| 44 | } | ||
| 45 | } | ||
| 46 | # printf("ignoring %d module(s)\n", $ignore); | ||
| 47 | |||
| 48 | # Ignore conglomerate objects, they have been built from multiple objects and we | ||
| 49 | # only care about the individual objects. If an object has more than one GCC: | ||
| 50 | # string in the comment section then it is conglomerate. This does not filter | ||
| 51 | # out conglomerates that consist of exactly one object, can't be helped. | ||
| 52 | |||
| 53 | # printf("Finding conglomerates, "); | ||
| 54 | $ignore = 0; | ||
| 55 | foreach $object (keys(%object)) { | ||
| 56 | if (exists($object{$object}->{'off'})) { | ||
| 57 | my ($off, $size, $comment, $l); | ||
| 58 | $off = hex($object{$object}->{'off'}); | ||
| 59 | $size = hex($object{$object}->{'size'}); | ||
| 60 | open(OBJECT, "<$object") || die "cannot read $object"; | ||
| 61 | seek(OBJECT, $off, 0) || die "seek to $off in $object failed"; | ||
| 62 | $l = read(OBJECT, $comment, $size); | ||
| 63 | die "read $size bytes from $object .comment failed" if ($l != $size); | ||
| 64 | close(OBJECT); | ||
| 65 | if ($comment =~ /GCC\:.*GCC\:/m || $object =~ /built-in\.o/) { | ||
| 66 | ++$ignore; | ||
| 67 | delete($object{$object}); | ||
| 68 | } | ||
| 69 | } | ||
| 70 | } | ||
| 71 | # printf("ignoring %d conglomerate(s)\n", $ignore); | ||
| 72 | |||
| 73 | # printf("Scanning objects\n"); | ||
| 74 | |||
| 75 | # Keith Ownes <kaos@sgi.com> commented: | ||
| 76 | # For our future {in}sanity, add a comment that this is the ppc .opd | ||
| 77 | # section, not the ia64 .opd section. | ||
| 78 | # ia64 .opd should not point to discarded sections. | ||
| 79 | $errorcount = 0; | ||
| 80 | foreach $object (keys(%object)) { | ||
| 81 | my $from; | ||
| 82 | open(OBJDUMP, "objdump -r $object|") || die "cannot objdump -r $object"; | ||
| 83 | while (defined($line = <OBJDUMP>)) { | ||
| 84 | chomp($line); | ||
| 85 | if ($line =~ /RELOCATION RECORDS FOR /) { | ||
| 86 | ($from = $line) =~ s/.*\[([^]]*).*/$1/; | ||
| 87 | } | ||
| 88 | if (($line =~ /\.text\.exit$/ || | ||
| 89 | $line =~ /\.exit\.text$/ || | ||
| 90 | $line =~ /\.data\.exit$/ || | ||
| 91 | $line =~ /\.exit\.data$/ || | ||
| 92 | $line =~ /\.exitcall\.exit$/) && | ||
| 93 | ($from !~ /\.text\.exit$/ && | ||
| 94 | $from !~ /\.exit\.text$/ && | ||
| 95 | $from !~ /\.data\.exit$/ && | ||
| 96 | $from !~ /\.opd$/ && | ||
| 97 | $from !~ /\.exit\.data$/ && | ||
| 98 | $from !~ /\.altinstructions$/ && | ||
| 99 | $from !~ /\.pdr$/ && | ||
| 100 | $from !~ /\.debug_.*$/ && | ||
| 101 | $from !~ /\.exitcall\.exit$/ && | ||
| 102 | $from !~ /\.eh_frame$/ && | ||
| 103 | $from !~ /\.stab$/)) { | ||
| 104 | printf("Error: %s %s refers to %s\n", $object, $from, $line); | ||
| 105 | $errorcount = $errorcount + 1; | ||
| 106 | } | ||
| 107 | } | ||
| 108 | close(OBJDUMP); | ||
| 109 | } | ||
| 110 | # printf("Done\n"); | ||
| 111 | |||
| 112 | exit(0); | ||
diff --git a/scripts/reference_init.pl b/scripts/reference_init.pl deleted file mode 100644 index 7f6960b175a2..000000000000 --- a/scripts/reference_init.pl +++ /dev/null | |||
| @@ -1,108 +0,0 @@ | |||
| 1 | #!/usr/bin/perl -w | ||
| 2 | # | ||
| 3 | # reference_init.pl (C) Keith Owens 2002 <kaos@ocs.com.au> | ||
| 4 | # | ||
| 5 | # List references to vmlinux init sections from non-init sections. | ||
| 6 | |||
| 7 | # Unfortunately I had to exclude references from read only data to .init | ||
| 8 | # sections, almost all of these are false positives, they are created by | ||
| 9 | # gcc. The downside of excluding rodata is that there really are some | ||
| 10 | # user references from rodata to init code, e.g. drivers/video/vgacon.c | ||
| 11 | # | ||
| 12 | # const struct consw vga_con = { | ||
| 13 | # con_startup: vgacon_startup, | ||
| 14 | # | ||
| 15 | # where vgacon_startup is __init. If you want to wade through the false | ||
| 16 | # positives, take out the check for rodata. | ||
| 17 | |||
| 18 | use strict; | ||
| 19 | die($0 . " takes no arguments\n") if($#ARGV >= 0); | ||
| 20 | |||
| 21 | my %object; | ||
| 22 | my $object; | ||
| 23 | my $line; | ||
| 24 | my $ignore; | ||
| 25 | |||
| 26 | $| = 1; | ||
| 27 | |||
| 28 | printf("Finding objects, "); | ||
| 29 | open(OBJDUMP_LIST, "find . -name '*.o' | xargs objdump -h |") || die "getting objdump list failed"; | ||
| 30 | while (defined($line = <OBJDUMP_LIST>)) { | ||
| 31 | chomp($line); | ||
| 32 | if ($line =~ /:\s+file format/) { | ||
| 33 | ($object = $line) =~ s/:.*//; | ||
| 34 | $object{$object}->{'module'} = 0; | ||
| 35 | $object{$object}->{'size'} = 0; | ||
| 36 | $object{$object}->{'off'} = 0; | ||
| 37 | } | ||
| 38 | if ($line =~ /^\s*\d+\s+\.modinfo\s+/) { | ||
| 39 | $object{$object}->{'module'} = 1; | ||
| 40 | } | ||
| 41 | if ($line =~ /^\s*\d+\s+\.comment\s+/) { | ||
| 42 | ($object{$object}->{'size'}, $object{$object}->{'off'}) = (split(' ', $line))[2,5]; | ||
| 43 | } | ||
| 44 | } | ||
| 45 | close(OBJDUMP_LIST); | ||
| 46 | printf("%d objects, ", scalar keys(%object)); | ||
| 47 | $ignore = 0; | ||
| 48 | foreach $object (keys(%object)) { | ||
| 49 | if ($object{$object}->{'module'}) { | ||
| 50 | ++$ignore; | ||
| 51 | delete($object{$object}); | ||
| 52 | } | ||
| 53 | } | ||
| 54 | printf("ignoring %d module(s)\n", $ignore); | ||
| 55 | |||
| 56 | # Ignore conglomerate objects, they have been built from multiple objects and we | ||
| 57 | # only care about the individual objects. If an object has more than one GCC: | ||
| 58 | # string in the comment section then it is conglomerate. This does not filter | ||
| 59 | # out conglomerates that consist of exactly one object, can't be helped. | ||
| 60 | |||
| 61 | printf("Finding conglomerates, "); | ||
| 62 | $ignore = 0; | ||
| 63 | foreach $object (keys(%object)) { | ||
| 64 | if (exists($object{$object}->{'off'})) { | ||
| 65 | my ($off, $size, $comment, $l); | ||
| 66 | $off = hex($object{$object}->{'off'}); | ||
| 67 | $size = hex($object{$object}->{'size'}); | ||
| 68 | open(OBJECT, "<$object") || die "cannot read $object"; | ||
| 69 | seek(OBJECT, $off, 0) || die "seek to $off in $object failed"; | ||
| 70 | $l = read(OBJECT, $comment, $size); | ||
| 71 | die "read $size bytes from $object .comment failed" if ($l != $size); | ||
| 72 | close(OBJECT); | ||
| 73 | if ($comment =~ /GCC\:.*GCC\:/m || $object =~ /built-in\.o/) { | ||
| 74 | ++$ignore; | ||
| 75 | delete($object{$object}); | ||
| 76 | } | ||
| 77 | } | ||
| 78 | } | ||
| 79 | printf("ignoring %d conglomerate(s)\n", $ignore); | ||
| 80 | |||
| 81 | printf("Scanning objects\n"); | ||
| 82 | foreach $object (sort(keys(%object))) { | ||
| 83 | my $from; | ||
| 84 | open(OBJDUMP, "objdump -r $object|") || die "cannot objdump -r $object"; | ||
| 85 | while (defined($line = <OBJDUMP>)) { | ||
| 86 | chomp($line); | ||
| 87 | if ($line =~ /RELOCATION RECORDS FOR /) { | ||
| 88 | ($from = $line) =~ s/.*\[([^]]*).*/$1/; | ||
| 89 | } | ||
| 90 | if (($line =~ /\.init$/ || $line =~ /\.init\./) && | ||
| 91 | ($from !~ /\.init$/ && | ||
| 92 | $from !~ /\.init\./ && | ||
| 93 | $from !~ /\.stab$/ && | ||
| 94 | $from !~ /\.rodata$/ && | ||
| 95 | $from !~ /\.text\.lock$/ && | ||
| 96 | $from !~ /\.pci_fixup_header$/ && | ||
| 97 | $from !~ /\.pci_fixup_final$/ && | ||
| 98 | $from !~ /\.pdr$/ && | ||
| 99 | $from !~ /\__param$/ && | ||
| 100 | $from !~ /\.altinstructions/ && | ||
| 101 | $from !~ /\.eh_frame/ && | ||
| 102 | $from !~ /\.debug_/)) { | ||
| 103 | printf("Error: %s %s refers to %s\n", $object, $from, $line); | ||
| 104 | } | ||
| 105 | } | ||
| 106 | close(OBJDUMP); | ||
| 107 | } | ||
| 108 | printf("Done\n"); | ||
diff --git a/sound/oss/.gitignore b/sound/oss/.gitignore new file mode 100644 index 000000000000..7efb12b45502 --- /dev/null +++ b/sound/oss/.gitignore | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | #Ignore generated files | ||
| 2 | maui_boot.h | ||
| 3 | pss_boot.h | ||
| 4 | trix_boot.h | ||
