Files
clang-p2996/compiler-rt/lib/dfsan/scripts/build-libc-list.py
Tobias Hieta f98ee40f4b [NFC][Py Reformat] Reformat python files in the rest of the dirs
This is an ongoing series of commits that are reformatting our
Python code. This catches the last of the python files to
reformat. Since they where so few I bunched them together.

Reformatting is done with `black`.

If you end up having problems merging this commit because you
have made changes to a python file, the best way to handle that
is to run git checkout --ours <yourfile> and then reformat it
with black.

If you run into any problems, post to discourse about it and
we will try to help.

RFC Thread below:

https://discourse.llvm.org/t/rfc-document-and-standardize-python-code-style

Reviewed By: jhenderson, #libc, Mordante, sivachandra

Differential Revision: https://reviews.llvm.org/D150784
2023-05-25 11:17:05 +02:00

104 lines
3.4 KiB
Python
Executable File

#!/usr/bin/env python3
# ===- lib/dfsan/scripts/build-libc-list.py ---------------------------------===#
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
# ===------------------------------------------------------------------------===#
# The purpose of this script is to identify every function symbol in a set of
# libraries (in this case, libc and libgcc) so that they can be marked as
# uninstrumented, thus allowing the instrumentation pass to treat calls to those
# functions correctly.
# Typical usage will list runtime libraries which are not instrumented by dfsan.
# This would include libc, and compiler builtins.
#
# ./build-libc-list.py \
# --lib-file=/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 \
# --lib-file=/lib/x86_64-linux-gnu/libanl.so.1 \
# --lib-file=/lib/x86_64-linux-gnu/libBrokenLocale.so.1 \
# --lib-file=/lib/x86_64-linux-gnu/libcidn.so.1 \
# --lib-file=/lib/x86_64-linux-gnu/libcrypt.so.1 \
# --lib-file=/lib/x86_64-linux-gnu/libc.so.6 \
# --lib-file=/lib/x86_64-linux-gnu/libdl.so.2 \
# --lib-file=/lib/x86_64-linux-gnu/libm.so.6 \
# --lib-file=/lib/x86_64-linux-gnu/libnsl.so.1 \
# --lib-file=/lib/x86_64-linux-gnu/libpthread.so.0 \
# --lib-file=/lib/x86_64-linux-gnu/libresolv.so.2 \
# --lib-file=/lib/x86_64-linux-gnu/librt.so.1 \
# --lib-file=/lib/x86_64-linux-gnu/libthread_db.so.1 \
# --lib-file=/lib/x86_64-linux-gnu/libutil.so.1 \
# --lib-file=/usr/lib/x86_64-linux-gnu/libc_nonshared.a \
# --lib-file=/usr/lib/x86_64-linux-gnu/libpthread_nonshared.a \
# --lib-file=/lib/x86_64-linux-gnu/libgcc_s.so.1 \
# --lib-file=/usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc.a \
# --error-missing-lib
import os
import subprocess
import sys
from optparse import OptionParser
def defined_function_list(lib):
"""Get non-local function symbols from lib."""
functions = []
readelf_proc = subprocess.Popen(
["readelf", "-s", "-W", lib], stdout=subprocess.PIPE
)
readelf = readelf_proc.communicate()[0].decode().split("\n")
if readelf_proc.returncode != 0:
raise subprocess.CalledProcessError(readelf_proc.returncode, "readelf")
for line in readelf:
if (
(line[31:35] == "FUNC" or line[31:36] == "IFUNC")
and line[39:44] != "LOCAL"
and line[55:58] != "UND"
):
function_name = line[59:].split("@")[0]
functions.append(function_name)
return functions
p = OptionParser()
p.add_option(
"--lib-file",
action="append",
metavar="PATH",
help="Specific library files to add.",
default=[],
)
p.add_option(
"--error-missing-lib",
action="store_true",
help="Make this script exit with an error code if any library is missing.",
dest="error_missing_lib",
default=False,
)
(options, args) = p.parse_args()
libs = options.lib_file
if not libs:
print("No libraries provided.", file=sys.stderr)
exit(1)
missing_lib = False
functions = []
for l in libs:
if os.path.exists(l):
functions += defined_function_list(l)
else:
missing_lib = True
print("warning: library %s not found" % l, file=sys.stderr)
if options.error_missing_lib and missing_lib:
print("Exiting with failure code due to missing library.", file=sys.stderr)
exit(1)
for f in sorted(set(functions)):
print("fun:%s=uninstrumented" % f)