208 lines
6.3 KiB
Bash
Executable file
208 lines
6.3 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright (C) 2011 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
# gen-system-symbols.sh
|
|
#
|
|
# This tool is used to read the shared library from a source directory
|
|
# (SRC) and extract the list of functions and variables.
|
|
#
|
|
# Then, for each library, it will generate in (DST) two text files
|
|
# named <library>.functions.txt and <library>.variables.txt
|
|
#
|
|
|
|
# Only runs on Linux because it requires the "readelf" utility
|
|
#
|
|
|
|
. `dirname $0`/prebuilt-common.sh
|
|
|
|
VERBOSE=no
|
|
|
|
PROGRAM_PARAMETERS="<src-dir> <dst-dir>"
|
|
PROGRAM_DESCRIPTION=\
|
|
"This program is used to parse all shared libraries in <src-dir>
|
|
and extract, for each one of them, the list of functions and variables
|
|
that it exports.
|
|
|
|
For some of these libraries, it will remove symbols that are not meant
|
|
to be imported (unless you use --no-symbol-filtering)
|
|
|
|
These lists will then be saved into two files:
|
|
|
|
<dst-dir>/<libname>.functions.txt
|
|
<dst-dir>/<libname>.variables.txt
|
|
"
|
|
|
|
NO_FILTERING=
|
|
register_var_option "--no-symbol-filtering" NO_FILTERING "Disable symbol filtering"
|
|
|
|
extract_parameters "$@"
|
|
|
|
parse_params ()
|
|
{
|
|
SRCDIR=$1
|
|
DSTDIR=$2
|
|
|
|
if [ -z "$SRCDIR" ]; then
|
|
dump "ERROR: Missing first parameter (source directory path), see --help"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$DSTDIR" ]; then
|
|
dump "ERROR: Missing second parameter (destination directory path), see --help"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d "$SRCDIR" ]; then
|
|
dump "ERROR: Not a source directory: $SRCDIR"
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p $DSTDIR
|
|
fail_panic "Could not create destination directory: $DSTDIR"
|
|
}
|
|
|
|
parse_params $PARAMETERS
|
|
|
|
READELF=readelf
|
|
|
|
# $1: shared library path
|
|
get_library_functions ()
|
|
{
|
|
$READELF -s -D -W $1 | awk '$5 ~ /FUNC/ && $6 ~ /GLOBAL|WEAK/ && $8 !~ /UND/ { print $9; }' | sort -u
|
|
}
|
|
|
|
# $1: shared library path
|
|
get_library_variables ()
|
|
{
|
|
$READELF -s -D -W $1 | awk '$5 ~ /OBJECT/ && $6 ~ /GLOBAL|WEAK/ && $8 !~ /UND/ { print $9; }' | sort -u
|
|
}
|
|
|
|
# Temp file used to list shared library symbol exclusions
|
|
# See set_symbol_excludes and extract_shared_library_xxxx functions below
|
|
SYMBOL_EXCLUDES=$TMPDIR/ndk-symbol-excludes.txt
|
|
|
|
# Temp file used to list shared library symbol inclusions, these
|
|
# are essentially overrides to the content of SYMBOL_EXCLUDES
|
|
SYMBOL_INCLUDES=$TMPDIR/ndk-symbol-includes.txt
|
|
|
|
# Temp file used to filter symbols
|
|
SYMBOL_TMPFILE=$TMPDIR/ndk-symbols-list.txt
|
|
|
|
# Reset the symbol exclusion list to its default
|
|
reset_symbol_excludes ()
|
|
{
|
|
# By default, do not export C++ mangled symbol, which all start with _Z
|
|
echo '^_Z' > $SYMBOL_EXCLUDES
|
|
|
|
# __INIT_ARRAY__, __FINI_ARRAY__ and _GLOBAL_OFFSET_TABLE_ are special symbols
|
|
# that should normally be hidden.
|
|
echo "^__INIT_ARRAY__" >> $SYMBOL_EXCLUDES
|
|
echo "^__FINI_ARRAY__" >> $SYMBOL_EXCLUDES
|
|
echo "^_GLOBAL_OFFSET_TABLE_" >> $SYMBOL_EXCLUDES
|
|
> $SYMBOL_INCLUDES
|
|
}
|
|
|
|
# Add new exclusion patterns to SYMBOL_EXCLUDES
|
|
set_symbol_excludes ()
|
|
{
|
|
(echo "$@" | tr ' ' '\n') >> $SYMBOL_EXCLUDES
|
|
}
|
|
|
|
# Add new inclusion patterns to SYMBOL_INCLUDES
|
|
set_symbol_includes ()
|
|
{
|
|
(echo "$@" | tr ' ' '\n') >> $SYMBOL_INCLUDES
|
|
}
|
|
|
|
# Clear symbol exclusion/inclusion files
|
|
clear_symbol_excludes ()
|
|
{
|
|
rm -f $SYMBOL_EXCLUDES $SYMBOL_INCLUDES
|
|
}
|
|
|
|
# Filter the list of symbols from a file
|
|
# $1: path to symbol list file
|
|
filter_symbols ()
|
|
{
|
|
(grep -v -f $SYMBOL_EXCLUDES $1 ; grep -f $SYMBOL_INCLUDES $1) | sort -u
|
|
}
|
|
|
|
# $1: Library name
|
|
# $2+: List of symbols (functions or variables)
|
|
# Out: sorted list of filtered symbols, based on library name
|
|
filter_library_symbols ()
|
|
{
|
|
local LIB=$1
|
|
shift
|
|
local SYMBOLS="$@"
|
|
(echo "$SYMBOLS" | tr ' ' '\n' | sort -u) > $SYMBOL_TMPFILE
|
|
|
|
reset_symbol_excludes
|
|
|
|
case $LIB in
|
|
libc.so)
|
|
# Remove a few internal symbols that should not be exposed
|
|
# from the C library (we plan to clean that up soon by using the
|
|
# "hidden" visibility attribute in the near future).
|
|
#
|
|
set_symbol_excludes \
|
|
'^the_' '^dns_' 'load_domain_search_list' 'res_get_dns_changed' \
|
|
'^_resolv_cache' '^_dns_getht' '^_thread_atexit' \
|
|
'^free_malloc_leak_info' 'fake_gmtime_r' 'fake_localtime_r' \
|
|
'^gAllocationsMutex' '^gHashTable' '^gMallocLeakZygoteChild'
|
|
# libc.so now absort libstdc++ use to have, thus contains C++ symbols from now on
|
|
set_symbol_includes '^_Z.*'
|
|
;;
|
|
libstdc++.so)
|
|
# This used to be the only library that is allowed to export C++ symbols for now.
|
|
set_symbol_includes '^_Z.*'
|
|
;;
|
|
liblog.so)
|
|
set_symbol_excludes '^.*' # exclude everything
|
|
set_symbol_includes '^__android_' # except __android_xxxx functions
|
|
;;
|
|
libOpenSLES.so)
|
|
set_symbol_excludes '^_' '^MPH_' # remove MPH_to_xxx definitions
|
|
;;
|
|
libGLESv*.so)
|
|
# Exclude non-OES extension entry points
|
|
set_symbol_excludes 'EXT$'
|
|
set_symbol_excludes 'AMD$'
|
|
set_symbol_excludes 'ANGLE$'
|
|
set_symbol_excludes 'APPLE$'
|
|
set_symbol_excludes 'IMG$'
|
|
set_symbol_excludes 'NV$'
|
|
set_symbol_excludes 'QCOM$'
|
|
;;
|
|
esac
|
|
filter_symbols "$SYMBOL_TMPFILE"
|
|
}
|
|
|
|
for LIB in $(cd $SRCDIR && ls lib*.so); do
|
|
SRCLIB=$SRCDIR/$LIB
|
|
log "Extracting symbols from $LIB"
|
|
FUNCS=$(get_library_functions $SRCLIB)
|
|
VARS=$(get_library_variables $SRCLIB)
|
|
if [ -z "$NO_FILTERING" ]; then
|
|
FUNCS=$(filter_library_symbols $LIB $FUNCS)
|
|
VARS=$(filter_library_symbols $LIB $VARS)
|
|
fi
|
|
NUMFUNCS=$(echo $FUNCS | wc -w)
|
|
NUMVARS=$(echo $VARS | wc -w)
|
|
log " Found $NUMFUNCS functions and $NUMVARS variables"
|
|
(echo "$FUNCS" | tr ' ' '\n') > $DSTDIR/$LIB.functions.txt
|
|
(echo "$VARS" | tr ' ' '\n') > $DSTDIR/$LIB.variables.txt
|
|
done
|