summaryrefslogtreecommitdiffstats
path: root/development/afl/afl.SlackBuild
blob: 079fe118465cf4863e07d01959e350f950806f5f (plain)
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/bash

# Slackware build script for afl

# Written by B. Watson (yalhcru@gmail.com)

# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.

# 20200217 bkw: BUILD=2.
# - fix afl-clang-fast
# - include README.llvm and optional README.qemu in doc dir
# - update README slightly
# 20180709 bkw: updated for v2.52b.

cd $(dirname $0) ; CWD=$(pwd)

PRGNAM=afl
VERSION=${VERSION:-2.52b}
BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}

if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i586 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi

# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
# the name of the created package would be, and then exit. This information
# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
  echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
  exit 0
fi

TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

if [ "$ARCH" = "i586" ]; then
  SLKCFLAGS="-O2 -march=i586 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

set -e

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tgz
cd $PRGNAM-$VERSION
chown -R root:root .
find -L .  -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \
        \! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+

# apply slack cflags, tell gcc to create stripped binaries
sed -i "/^CFLAGS/s|-O3.*|$SLKCFLAGS -Wl,-s|" Makefile llvm_mode/Makefile
sed -i "/^CFLAGS/s|-O3|$SLKCFLAGS|" qemu_mode/build_qemu_support.sh

PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION

make \
  DESTDIR=$PKG \
  PREFIX=/usr \
  HELPER_PATH=/usr/lib$LIBDIRSUFFIX/$PRGNAM \
  DOC_PATH=/usr/doc/$PRGNAM-$VERSION \
  all \
  install

# llvm fast mode looks useful, include it.
# comment this out if you're building on slack 14.1, its llvm is too old.
make -C llvm_mode \
  PREFIX=/usr \
  HELPER_PATH=/usr/lib$LIBDIRSUFFIX/$PRGNAM

# no 'make install' support, manual install.
install -s -m0755 -oroot -groot afl-clang-fast $PKG/usr/bin
ln -s afl-clang-fast $PKG/usr/bin/afl-clang-fast++

# 20200217 bkw: clang fast mode support libraries. Thanks to mity for
# a very detailed bug report.
CLANGLIB=$PKG/usr/lib$LIBDIRSUFFIX/$PRGNAM
install -s -m0755 -oroot -groot afl-llvm-pass.so $CLANGLIB
# no -s here, stripping this would be bad:
install -m0644 -oroot -groot afl-llvm-rt*.o $CLANGLIB

# replace identical .o files with symlinks
baseobj=$CLANGLIB/afl-llvm-rt.o
for bits in 32 64; do
  bitobj=$CLANGLIB/afl-llvm-rt-$bits.o
  if [ -e $bitobj ] && cmp $bitobj $baseobj; then
    rm -f $bitobj
	 ln -s afl-llvm-rt.o $bitobj
  fi
done

WITHQEMU="without"

# figure out the qemu source tarball name. N.B. update the README
# when this changes!
( egrep "^(VERSION|QEMU_URL)=" qemu_mode/build_qemu_support.sh > 1.sh
  source ./1.sh
  echo "$QEMU_URL" > qemu.url )
QEMU_SRC="$( basename "$( cat qemu.url )" )"

# optional qemu support, needed for fuzzing binary-only stuff,
# only built if $CWD contains the qemu source.
if [ -e "$CWD/$QEMU_SRC" ]; then
  echo "=== qemu source \$CWD/$QEMU_SRC found"
  cp "$CWD/$QEMU_SRC" qemu_mode

  cd qemu_mode
    sh build_qemu_support.sh
    cp -a README.qemu $PKGDOC
  cd -

  install -s -m0755 -oroot -groot afl-qemu-trace $PKG/usr/bin
  WITHQEMU="with"
else
  echo "!!! qemu source \$CWD/$QEMU_SRC not found"
  echo "!!! wget $( cat qemu.url )"
  # grep for the !!! in the log to find the URL, when updating afl
fi

# 'make install' already put the docs where they belong.
# the experimental/ stuff is sample source code, include in docs.
# since llvm_mode has no 'make install', we install its doc here.
cp -a llvm_mode/README.llvm experimental $PKGDOC
cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild

mkdir -p $PKG/install
sed "s,@WITHQEMU@,$WITHQEMU," $CWD/slack-desc > $PKG/install/slack-desc

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE