Пост #261768

     
сохранен 13.04.2022 10:53
  • Редактировать пост
  • Печать
  • Скачать
  • Посты-ответы на этот пост:  # 274387 # 274660
  • Посмотреть дерево постов
  • Сравнить с постом
    #  
  • Нумерация строк
  • Подсветка синтаксиса  
Текст поста
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/bin/sh

s_term() {
    #EC_OK
    exit 0
}

trap s_term 15

die() {
    retval=$1
    shift
    echo "Fatal error: $*" >&2
    exit $retval
}

warning() {
    echo "Warning: $*" >&2
}

debug() {
    if [ -n "$DEBUG" ] ; then
        echo "Debug: $*" >&2
    fi
}

get_platform() {
    uname -s | LC_ALL=C tr '[A-Z]' '[a-z]'
}

get_lib_path() {
    binary="$1"
    lib="$2"
    $LDD $LDD_RECURSIVE "$binary" 2>&1 | grep "$lib" | head -n1 | while read lib dummy path ; do echo $path ; done | cut -d' ' -f1
}

binary_grep() {
    pattern="$1"
    binary="$2"
    [ -r "$binary" ] || return 1
    env LC_ALL=C tr -dc '[:print:]' < "$binary" | grep -F "$pattern" >/dev/null 2>&1
}

append_to_library_path() {
    debug "Append \"$1\" to LD_LIBRARY_PATH"
    if [ -d "$LIBDIR/$1" ] ; then
        true
    else
        debug "\"$1\" is not a directory"
        return
    fi
    LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${LIBDIR}/$1"
    export LD_LIBRARY_PATH
}

run() {
    libs=""
    loader=""
    if [ "$PLATFORM" = "linux" ] ; then
        lddOutput="`LANGUAGE=C LANG=C $LDD $LDD_RECURSIVE "$BINARY" 2>&1`"
        if echo "$lddOutput" | grep gzopen64 >/dev/null 2>&1 ; then
            append_to_library_path "ldwrap/libz.so.1"
        fi
    elif [ "$PLATFORM" = "freebsd" ] ; then
        #rpath doesn't work here
        append_to_library_path ""
        #own gcc prefer for BSD
        append_to_library_path "ldwrap/gcc"
    fi
    if binary_grep "libstdc++.so.6" "$BINARY" ; then
        libpath="`get_lib_path "$BINARY" "libstdc++.so.6" 2>/dev/null`"
        if binary_grep "CXXABI_$MIN_CXXABI" "$libpath" ; then
            true
        else
            append_to_library_path "ldwrap/gcc"
        fi
    fi
    for i in 1 2; do
        libs="`LANGUAGE=C LANG=C $LDD $LDD_RECURSIVE "$BINARY" 2>&1 | \
            grep 'not found' | awk '{print $1}'| sort | uniq`"
	if [ -z "$libs" ]; then break; fi
        for lib in $libs ; do
            append_to_library_path "ldwrap/$lib"
        done
    done

    debug "Finally LD_LIBRARY_PATH is \"$LD_LIBRARY_PATH\""
    if [ -n "$loader" ] ; then
        exec $LOADER "$BINARY" "$@"
        retval=$?
    else
        exec "$BINARY" "$@"
        retval=$?
    fi
    return $retval
}

LDD="/usr/bin/ldd"
[ -x "$LDD" ] || die 125 "ldd not found. Fix PATH and try again."

PLATFORM=linux
PREFIX=/opt/drweb.com
LIBDIR=/opt/drweb.com/lib/x86_64-linux-gnu
CONFDIR=/etc/opt/drweb.com

BINARY="$PREFIX/bin/`basename "$0.real"`"
LINKNAME="`basename "$0"`"

[ -x "$BINARY" ] || die 104 "$BINARY not found or not executable"

if [ -d "$CONFDIR/ldwrap.conf.d" ] ; then
    for f in $CONFDIR/ldwrap.conf.d/*.conf ; do
        [ -r "$f" ] && . "$f"
    done
fi

MIN_CXXABI=1.3.12
if [ -n "$ARGS" ] ; then
    run "$@" "$ARGS"
else
    run "$@"
fi
exit $?
Добавить комментарий
Автор