diff options
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/depmod.sh | 10 | ||||
-rw-r--r-- | scripts/mod/modpost.c | 29 |
2 files changed, 34 insertions, 5 deletions
diff --git a/scripts/depmod.sh b/scripts/depmod.sh index 3b029cba2baf..a27235685949 100755 --- a/scripts/depmod.sh +++ b/scripts/depmod.sh | |||
@@ -21,13 +21,15 @@ fi | |||
21 | # older versions of depmod require the version string to start with three | 21 | # older versions of depmod require the version string to start with three |
22 | # numbers, so we cheat with a symlink here | 22 | # numbers, so we cheat with a symlink here |
23 | depmod_hack_needed=true | 23 | depmod_hack_needed=true |
24 | mkdir -p .tmp_depmod/lib/modules/$KERNELRELEASE | 24 | tmp_dir=$(mktemp -d ${TMPDIR:-/tmp}/depmod.XXXXXX) |
25 | if "$DEPMOD" -b .tmp_depmod $KERNELRELEASE 2>/dev/null; then | 25 | mkdir -p "$tmp_dir/lib/modules/$KERNELRELEASE" |
26 | if test -e .tmp_depmod/lib/modules/$KERNELRELEASE/modules.dep -o \ | 26 | if "$DEPMOD" -b "$tmp_dir" $KERNELRELEASE 2>/dev/null; then |
27 | -e .tmp_depmod/lib/modules/$KERNELRELEASE/modules.dep.bin; then | 27 | if test -e "$tmp_dir/lib/modules/$KERNELRELEASE/modules.dep" -o \ |
28 | -e "$tmp_dir/lib/modules/$KERNELRELEASE/modules.dep.bin"; then | ||
28 | depmod_hack_needed=false | 29 | depmod_hack_needed=false |
29 | fi | 30 | fi |
30 | fi | 31 | fi |
32 | rm -rf "$tmp_dir" | ||
31 | if $depmod_hack_needed; then | 33 | if $depmod_hack_needed; then |
32 | symlink="$INSTALL_MOD_PATH/lib/modules/99.98.$KERNELRELEASE" | 34 | symlink="$INSTALL_MOD_PATH/lib/modules/99.98.$KERNELRELEASE" |
33 | ln -s "$KERNELRELEASE" "$symlink" | 35 | ln -s "$KERNELRELEASE" "$symlink" |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 413c53693e62..a509ff8f32fa 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -254,6 +254,28 @@ static enum export export_no(const char *s) | |||
254 | return export_unknown; | 254 | return export_unknown; |
255 | } | 255 | } |
256 | 256 | ||
257 | static const char *sec_name(struct elf_info *elf, int secindex); | ||
258 | |||
259 | #define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0) | ||
260 | |||
261 | static enum export export_from_secname(struct elf_info *elf, unsigned int sec) | ||
262 | { | ||
263 | const char *secname = sec_name(elf, sec); | ||
264 | |||
265 | if (strstarts(secname, "___ksymtab+")) | ||
266 | return export_plain; | ||
267 | else if (strstarts(secname, "___ksymtab_unused+")) | ||
268 | return export_unused; | ||
269 | else if (strstarts(secname, "___ksymtab_gpl+")) | ||
270 | return export_gpl; | ||
271 | else if (strstarts(secname, "___ksymtab_unused_gpl+")) | ||
272 | return export_unused_gpl; | ||
273 | else if (strstarts(secname, "___ksymtab_gpl_future+")) | ||
274 | return export_gpl_future; | ||
275 | else | ||
276 | return export_unknown; | ||
277 | } | ||
278 | |||
257 | static enum export export_from_sec(struct elf_info *elf, unsigned int sec) | 279 | static enum export export_from_sec(struct elf_info *elf, unsigned int sec) |
258 | { | 280 | { |
259 | if (sec == elf->export_sec) | 281 | if (sec == elf->export_sec) |
@@ -563,7 +585,12 @@ static void handle_modversions(struct module *mod, struct elf_info *info, | |||
563 | Elf_Sym *sym, const char *symname) | 585 | Elf_Sym *sym, const char *symname) |
564 | { | 586 | { |
565 | unsigned int crc; | 587 | unsigned int crc; |
566 | enum export export = export_from_sec(info, get_secindex(info, sym)); | 588 | enum export export; |
589 | |||
590 | if (!is_vmlinux(mod->name) && strncmp(symname, "__ksymtab", 9) == 0) | ||
591 | export = export_from_secname(info, get_secindex(info, sym)); | ||
592 | else | ||
593 | export = export_from_sec(info, get_secindex(info, sym)); | ||
567 | 594 | ||
568 | switch (sym->st_shndx) { | 595 | switch (sym->st_shndx) { |
569 | case SHN_COMMON: | 596 | case SHN_COMMON: |