57 lines
1.7 KiB
Bash
57 lines
1.7 KiB
Bash
#! /bin/bash
|
|
|
|
sourcedir=${0%/*}
|
|
|
|
# A lot of symbols are exported by the main kernel image. Find out
|
|
# more precisely which built-in.o file defines them, and fill in
|
|
# that information in Module.symvers. (The built-in.o files are
|
|
# linked together from one or more object files in a directory.)
|
|
# We use this information to better group symbols by subsystems.
|
|
#
|
|
# Usage: built-in-where < Module.symvers
|
|
|
|
unset LANG ${!LC_*}
|
|
|
|
# Create a table of all symbol export in a built-in.o file, e.g.,
|
|
# 0xc87c1f84 ktime_get kernel/built-in EXPORT_SYMBOL_GPL
|
|
built_in_exports() {
|
|
# a/b/c/built-in.o gets linked into a/b/built-in.o, so ensure
|
|
# that we visit sub-directories first to split up symbols as
|
|
# much as possible.
|
|
for obj in $(find -name built-in.o -printf '%d %P\n' \
|
|
| sort -r \
|
|
| awk '{ print $2 }'); do
|
|
$sourcedir/symsets.pl --list-exported-symbols $obj
|
|
done
|
|
|
|
# We could go through the libraries as well, but those functions
|
|
# are so unlikely to change that this wouldn't help.
|
|
# (All remaining symbols will end up in the vmlinux set.)
|
|
#for archive in $(find -name '*.a'); do
|
|
# $sourcedir/symsets.pl --list-exported-symbols $archive
|
|
#done
|
|
}
|
|
|
|
# Filter out duplicates from a Module.symvers dump
|
|
unique_symbols() {
|
|
awk '
|
|
{ if ($2 in seen)
|
|
next
|
|
seen[$2] = 1
|
|
print
|
|
}
|
|
'
|
|
}
|
|
|
|
# Join together the two tables, including all lines from the first
|
|
# file that don't have a match in the second.
|
|
# Finally, remove the duplicate columns.
|
|
join -t $'\t' -j 2 -a 1 \
|
|
<(sort -k2) \
|
|
<(built_in_exports | unique_symbols | sort -k2) \
|
|
| awk '
|
|
BEGIN { FS = "\t" ; OFS = "\t" }
|
|
NF == 7 { print $2, $1, $6, $4 }
|
|
NF == 4 { print $2, $1, $3, $4 }
|
|
'
|