-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
root
committed
Nov 25, 2024
1 parent
bf42eca
commit 43d729a
Showing
11 changed files
with
611 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#!/bin/bash | ||
|
||
# Symbol to search for | ||
SYMBOL="$2" | ||
|
||
# Check if a directory was provided | ||
if [ -z "$1" ]; then | ||
echo "Usage: $0 /path/to/directory symbol" | ||
exit 1 | ||
fi | ||
|
||
# Directory to search | ||
DIR="$1" | ||
|
||
# Find all .so and .a files and process them | ||
find "$DIR" -type f \( -name '*.so*' -o -name '*.a' \) -print0 | while IFS= read -r -d '' file; do | ||
# Run nm and search for the symbol | ||
if nm -D -U "$file" 2>/dev/null | grep -Fq "$SYMBOL"; then | ||
echo "Symbol found in: $file" | ||
fi | ||
done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
#!/usr/bin/env bash | ||
|
||
# check-rpath.sh | ||
|
||
#!/bin/bash | ||
|
||
set -e | ||
|
||
# Usage function | ||
usage() { | ||
echo "Usage: $0 /path/to/directory" | ||
exit 1 | ||
} | ||
|
||
# Check if directory is provided | ||
if [ -z "$1" ]; then | ||
usage | ||
fi | ||
|
||
DIRECTORY="$1" | ||
|
||
# Verify the directory exists | ||
if [ ! -d "$DIRECTORY" ]; then | ||
echo "Error: Directory '$DIRECTORY' does not exist." | ||
exit 1 | ||
fi | ||
|
||
LIBZ_DIR="/nix/store/2k9k3q1vk8z6w7743k6nb22vnb05xv06-zlib-1.3.1/lib/" | ||
echo "Library directory: $LIBZ_DIR" | ||
|
||
# Iterate over all files in the directory | ||
find "$DIRECTORY" -maxdepth 1 -type f | while read -r FILE; do | ||
# Check if file is an ELF executable | ||
if file "$FILE" | grep -q 'ELF'; then | ||
echo "Processing ELF executable: $FILE" | ||
|
||
# Backup the original file | ||
cp "$FILE" "$FILE.bak" | ||
|
||
# Get existing RPATH | ||
EXISTING_RPATH=$(patchelf --print-rpath "$FILE" || true) | ||
|
||
# Determine the new RPATH | ||
if [ -z "$EXISTING_RPATH" ]; then | ||
NEW_RPATH="$LIBZ_DIR" | ||
else | ||
NEW_RPATH="$EXISTING_RPATH:$LIBZ_DIR" | ||
fi | ||
|
||
# Modify the RPATH | ||
patchelf --set-rpath "$NEW_RPATH" "$FILE" | ||
|
||
echo "Updated RPATH for $FILE to $NEW_RPATH" | ||
else | ||
echo "Skipping non-ELF file: $FILE" | ||
fi | ||
done | ||
|
||
echo "RPATH update complete." |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,276 @@ | ||
#! /nix/store/717iy55ncqs0wmhdkwc5fg2vci5wbmq8-bash-5.2p32/bin/bash | ||
set -eu -o pipefail +o posix | ||
shopt -s nullglob | ||
|
||
if (( "${NIX_DEBUG:-0}" >= 7 )); then | ||
set -x | ||
fi | ||
|
||
path_backup="$PATH" | ||
|
||
# That @-vars are substituted separately from bash evaluation makes | ||
# shellcheck think this, and others like it, are useless conditionals. | ||
# shellcheck disable=SC2157 | ||
if [[ -n "/nix/store/ph44jcx3ddmlwh394mh1wb7f1qigxqb1-coreutils-9.5" && -n "/nix/store/lvnwdmnjm7nvaq0a3vhvvn46iy4ql7gr-gnugrep-3.11" ]]; then | ||
PATH="/nix/store/ph44jcx3ddmlwh394mh1wb7f1qigxqb1-coreutils-9.5/bin:/nix/store/lvnwdmnjm7nvaq0a3vhvvn46iy4ql7gr-gnugrep-3.11/bin" | ||
fi | ||
|
||
source /nix/store/5j2f6adr7awqag8c7cv6q4px0lz477gc-clang-wrapper-19.1.1/nix-support/utils.bash | ||
|
||
|
||
# Parse command line options and set several variables. | ||
# For instance, figure out if linker flags should be passed. | ||
# GCC prints annoying warnings when they are not needed. | ||
dontLink=0 | ||
nonFlagArgs=0 | ||
cc1=0 | ||
# shellcheck disable=SC2193 | ||
[[ "/nix/store/m4yb6xs0g07l0bc3c4i0klgv5lgz7g6s-clang-19.1.1/bin/clang++" = *++ ]] && isCxx=1 || isCxx=0 | ||
cxxInclude=1 | ||
cxxLibrary=1 | ||
cInclude=1 | ||
|
||
expandResponseParams "$@" | ||
|
||
declare -ag positionalArgs=() | ||
declare -i n=0 | ||
nParams=${#params[@]} | ||
while (( "$n" < "$nParams" )); do | ||
p=${params[n]} | ||
p2=${params[n+1]:-} # handle `p` being last one | ||
n+=1 | ||
|
||
case "$p" in | ||
-[cSEM] | -MM) dontLink=1 ;; | ||
-cc1) cc1=1 ;; | ||
-nostdinc) cInclude=0 cxxInclude=0 ;; | ||
-nostdinc++) cxxInclude=0 ;; | ||
-nostdlib) cxxLibrary=0 ;; | ||
-x*-header) dontLink=1 ;; # both `-x c-header` and `-xc-header` are accepted by clang | ||
-xc++*) isCxx=1 ;; # both `-xc++` and `-x c++` are accepted by clang | ||
-x) | ||
case "$p2" in | ||
*-header) dontLink=1 ;; | ||
c++*) isCxx=1 ;; | ||
esac | ||
;; | ||
--) # Everything else is positional args! | ||
# See: https://github.com/llvm/llvm-project/commit/ed1d07282cc9d8e4c25d585e03e5c8a1b6f63a74 | ||
|
||
# Any positional arg (i.e. any argument after `--`) will be | ||
# interpreted as a "non flag" arg: | ||
if [[ -v "params[$n]" ]]; then nonFlagArgs=1; fi | ||
|
||
positionalArgs=("${params[@]:$n}") | ||
params=("${params[@]:0:$((n - 1))}") | ||
break; | ||
;; | ||
-?*) ;; | ||
*) nonFlagArgs=1 ;; # Includes a solitary dash (`-`) which signifies standard input; it is not a flag | ||
esac | ||
done | ||
|
||
# If we pass a flag like -Wl, then gcc will call the linker unless it | ||
# can figure out that it has to do something else (e.g., because of a | ||
# "-c" flag). So if no non-flag arguments are given, don't pass any | ||
# linker flags. This catches cases like "gcc" (should just print | ||
# "gcc: no input files") and "gcc -v" (should print the version). | ||
if [ "$nonFlagArgs" = 0 ]; then | ||
dontLink=1 | ||
fi | ||
|
||
# Arocc does not link | ||
if [ "" = 1 ]; then | ||
dontLink=1 | ||
fi | ||
|
||
# Optionally filter out paths not refering to the store. | ||
if [[ "${NIX_ENFORCE_PURITY:-}" = 1 && -n "$NIX_STORE" ]]; then | ||
kept=() | ||
nParams=${#params[@]} | ||
declare -i n=0 | ||
while (( "$n" < "$nParams" )); do | ||
p=${params[n]} | ||
p2=${params[n+1]:-} # handle `p` being last one | ||
n+=1 | ||
|
||
skipNext=false | ||
path="" | ||
case "$p" in | ||
-[IL]/*) path=${p:2} ;; | ||
-[IL] | -isystem) path=$p2 skipNext=true ;; | ||
esac | ||
|
||
if [[ -n $path ]] && badPath "$path"; then | ||
skip "$path" | ||
$skipNext && n+=1 | ||
continue | ||
fi | ||
|
||
kept+=("$p") | ||
done | ||
# Old bash empty array hack | ||
params=(${kept+"${kept[@]}"}) | ||
fi | ||
|
||
# Flirting with a layer violation here. | ||
if [ -z "${NIX_BINTOOLS_WRAPPER_FLAGS_SET_x86_64_unknown_linux_gnu:-}" ]; then | ||
source /nix/store/lfabp2rmzyn7ddbhgls0gsjjqckzw3np-binutils-wrapper-2.43.1/nix-support/add-flags.sh | ||
fi | ||
|
||
# Put this one second so libc ldflags take priority. | ||
if [ -z "${NIX_CC_WRAPPER_FLAGS_SET_x86_64_unknown_linux_gnu:-}" ]; then | ||
source /nix/store/5j2f6adr7awqag8c7cv6q4px0lz477gc-clang-wrapper-19.1.1/nix-support/add-flags.sh | ||
fi | ||
|
||
# Clear march/mtune=native -- they bring impurity. | ||
if [ "$NIX_ENFORCE_NO_NATIVE_x86_64_unknown_linux_gnu" = 1 ]; then | ||
kept=() | ||
# Old bash empty array hack | ||
for p in ${params+"${params[@]}"}; do | ||
if [[ "$p" = -m*=native ]]; then | ||
skip "$p" | ||
else | ||
kept+=("$p") | ||
fi | ||
done | ||
# Old bash empty array hack | ||
params=(${kept+"${kept[@]}"}) | ||
fi | ||
|
||
if [[ "$isCxx" = 1 ]]; then | ||
if [[ "$cxxInclude" = 1 ]]; then | ||
# | ||
# The motivation for this comment is to explain the reason for appending | ||
# the C++ stdlib to NIX_CFLAGS_COMPILE, which I initially thought should | ||
# change and later realized it shouldn't in: | ||
# | ||
# https://github.com/NixOS/nixpkgs/pull/185569#issuecomment-1234959249 | ||
# | ||
# NIX_CFLAGS_COMPILE contains dependencies added using "-isystem", and | ||
# NIX_CXXSTDLIB_COMPILE adds the C++ stdlib using "-isystem". Appending | ||
# NIX_CXXSTDLIB_COMPILE to NIX_CLAGS_COMPILE emulates this part of the | ||
# include lookup order from GCC/Clang: | ||
# | ||
# > 4. Directories specified with -isystem options are scanned in | ||
# > left-to-right order. | ||
# > 5. Standard system directories are scanned. | ||
# > 6. Directories specified with -idirafter options are scanned | ||
# > in left-to-right order. | ||
# | ||
# NIX_CXX_STDLIB_COMPILE acts as the "standard system directories" that | ||
# are otherwise missing from CC in nixpkgs, so should be added last. | ||
# | ||
# This means that the C standard library should never be present inside | ||
# NIX_CFLAGS_COMPILE, because it MUST come after the C++ stdlib. It is | ||
# added automatically by cc-wrapper later using "-idirafter". | ||
# | ||
NIX_CFLAGS_COMPILE_x86_64_unknown_linux_gnu+=" $NIX_CXXSTDLIB_COMPILE_x86_64_unknown_linux_gnu" | ||
fi | ||
if [[ "$cxxLibrary" = 1 ]]; then | ||
NIX_CFLAGS_LINK_x86_64_unknown_linux_gnu+=" $NIX_CXXSTDLIB_LINK_x86_64_unknown_linux_gnu" | ||
fi | ||
fi | ||
|
||
source /nix/store/5j2f6adr7awqag8c7cv6q4px0lz477gc-clang-wrapper-19.1.1/nix-support/add-hardening.sh | ||
|
||
# Add the flags for the C compiler proper. | ||
extraAfter=(${hardeningCFlagsAfter[@]+"${hardeningCFlagsAfter[@]}"} $NIX_CFLAGS_COMPILE_x86_64_unknown_linux_gnu) | ||
extraBefore=(${hardeningCFlagsBefore[@]+"${hardeningCFlagsBefore[@]}"} $NIX_CFLAGS_COMPILE_BEFORE_x86_64_unknown_linux_gnu) | ||
|
||
# Remove '-fzero-call-used-regs=used-gpr' from extraBefore | ||
filteredExtraBefore=() | ||
for arg in "${extraBefore[@]}"; do | ||
if [[ "$arg" != "-fzero-call-used-regs=used-gpr" ]]; then | ||
filteredExtraBefore+=("$arg") | ||
fi | ||
done | ||
extraBefore=("${filteredExtraBefore[@]}") | ||
|
||
if [ "$dontLink" != 1 ]; then | ||
linkType=$(checkLinkType $NIX_LDFLAGS_BEFORE_x86_64_unknown_linux_gnu "${params[@]}" ${NIX_CFLAGS_LINK_x86_64_unknown_linux_gnu:-} $NIX_LDFLAGS_x86_64_unknown_linux_gnu) | ||
|
||
# Add the flags that should only be passed to the compiler when | ||
# linking. | ||
extraAfter+=($(filterRpathFlags "$linkType" $NIX_CFLAGS_LINK_x86_64_unknown_linux_gnu)) | ||
|
||
# Add the flags that should be passed to the linker (and prevent | ||
# `ld-wrapper' from adding NIX_LDFLAGS_x86_64_unknown_linux_gnu again). | ||
for i in $(filterRpathFlags "$linkType" $NIX_LDFLAGS_BEFORE_x86_64_unknown_linux_gnu); do | ||
extraBefore+=("-Wl,$i") | ||
done | ||
if [[ "$linkType" == dynamic && -n "$NIX_DYNAMIC_LINKER_x86_64_unknown_linux_gnu" ]]; then | ||
extraBefore+=("-Wl,-dynamic-linker=$NIX_DYNAMIC_LINKER_x86_64_unknown_linux_gnu") | ||
fi | ||
for i in $(filterRpathFlags "$linkType" $NIX_LDFLAGS_x86_64_unknown_linux_gnu); do | ||
if [ "${i:0:3}" = -L/ ]; then | ||
extraAfter+=("$i") | ||
else | ||
extraAfter+=("-Wl,$i") | ||
fi | ||
done | ||
export NIX_LINK_TYPE_x86_64_unknown_linux_gnu=$linkType | ||
fi | ||
|
||
if [[ -e /nix/store/5j2f6adr7awqag8c7cv6q4px0lz477gc-clang-wrapper-19.1.1/nix-support/add-local-cc-cflags-before.sh ]]; then | ||
source /nix/store/5j2f6adr7awqag8c7cv6q4px0lz477gc-clang-wrapper-19.1.1/nix-support/add-local-cc-cflags-before.sh | ||
fi | ||
|
||
# As a very special hack, if the arguments are just `-v', then don't | ||
# add anything. This is to prevent `gcc -v' (which normally prints | ||
# out the version number and returns exit code 0) from printing out | ||
# `No input files specified' and returning exit code 1. | ||
if [ "$*" = -v ]; then | ||
extraAfter=() | ||
extraBefore=() | ||
fi | ||
|
||
# clang's -cc1 mode is not compatible with most options | ||
# that we would pass. Rather than trying to pass only | ||
# options that would work, let's just remove all of them. | ||
if [ "$cc1" = 1 ]; then | ||
extraAfter=() | ||
extraBefore=() | ||
fi | ||
|
||
# Finally, if we got any positional args, append them to `extraAfter` | ||
# now: | ||
if [[ "${#positionalArgs[@]}" -gt 0 ]]; then | ||
extraAfter+=(-- "${positionalArgs[@]}") | ||
fi | ||
|
||
#NIX_DEBUG=1 | ||
# Optionally print debug info. | ||
if (( "${NIX_DEBUG:-0}" >= 1 )); then | ||
# Old bash workaround, see ld-wrapper for explanation. | ||
echo "extra flags before to /nix/store/m4yb6xs0g07l0bc3c4i0klgv5lgz7g6s-clang-19.1.1/bin/clang++:" >&2 | ||
printf " %q\n" ${extraBefore+"${extraBefore[@]}"} >&2 | ||
echo "original flags to /nix/store/m4yb6xs0g07l0bc3c4i0klgv5lgz7g6s-clang-19.1.1/bin/clang++:" >&2 | ||
printf " %q\n" ${params+"${params[@]}"} >&2 | ||
echo "extra flags after to /nix/store/m4yb6xs0g07l0bc3c4i0klgv5lgz7g6s-clang-19.1.1/bin/clang++:" >&2 | ||
printf " %q\n" ${extraAfter+"${extraAfter[@]}"} >&2 | ||
fi | ||
|
||
PATH="$path_backup" | ||
# Old bash workaround, see above. | ||
|
||
# if a cc-wrapper-hook exists, run it. | ||
if [[ -e /nix/store/5j2f6adr7awqag8c7cv6q4px0lz477gc-clang-wrapper-19.1.1/nix-support/cc-wrapper-hook ]]; then | ||
compiler=/nix/store/m4yb6xs0g07l0bc3c4i0klgv5lgz7g6s-clang-19.1.1/bin/clang++ | ||
source /nix/store/5j2f6adr7awqag8c7cv6q4px0lz477gc-clang-wrapper-19.1.1/nix-support/cc-wrapper-hook | ||
fi | ||
|
||
if (( "${NIX_CC_USE_RESPONSE_FILE:-1}" >= 1 )); then | ||
responseFile=$(mktemp "${TMPDIR:-/tmp}/cc-params.XXXXXX") | ||
trap 'rm -f -- "$responseFile"' EXIT | ||
printf "%q\n" \ | ||
${extraBefore+"${extraBefore[@]}"} \ | ||
${params+"${params[@]}"} \ | ||
${extraAfter+"${extraAfter[@]}"} > "$responseFile" | ||
/nix/store/m4yb6xs0g07l0bc3c4i0klgv5lgz7g6s-clang-19.1.1/bin/clang++ "@$responseFile" | ||
else | ||
exec /nix/store/m4yb6xs0g07l0bc3c4i0klgv5lgz7g6s-clang-19.1.1/bin/clang++ \ | ||
${extraBefore+"${extraBefore[@]}"} \ | ||
${params+"${params[@]}"} \ | ||
${extraAfter+"${extraAfter[@]}"} | ||
fi |
Oops, something went wrong.