Blame SOURCES/dummylib.sh

f28b6a
#!/bin/sh
f28b6a
if [ $# -lt 3 ]; then echo Usage: dummylib.sh orig_lib_path dummy_lib_path mapfile; exit 1; fi
f28b6a
TMPDIR=`mktemp -d dummylib.sh.XXXXXX` || exit 1
f28b6a
F=`file -L $1`
f28b6a
C=
f28b6a
S=8
f28b6a
case "$F" in
f28b6a
  *ELF\ 64-bit*shared\ object*x86-64*) C=-m64;;
f28b6a
  *ELF\ 32-bit*shared\ object*80?86*) C=-m32; S=4;;
f28b6a
  *ELF\ 64-bit*shared\ object*PowerPC*) C=-m64;;
f28b6a
  *ELF\ 32-bit*shared\ object*PowerPC*) C=-m32; S=4;;
f28b6a
  *ELF\ 64-bit*shared\ object*cisco*) C=-m64;;
f28b6a
  *ELF\ 32-bit*shared\ object*cisco*) C=-m32; S=4;;
f28b6a
  *ELF\ 64-bit*shared\ object*IA-64*) C=;;
f28b6a
  *ELF\ 64-bit*shared\ object*Alpha*) C=;;
f28b6a
  *ELF\ 64-bit*shared\ object*390*) C=-m64;;
f28b6a
  *ELF\ 32-bit*shared\ object*390*) C=-m31; S=4;;
f28b6a
  *ELF\ 64-bit*shared\ object*SPARC*) C=-m64;;
f28b6a
  *ELF\ 32-bit*shared\ object*SPARC*) C=-m32; S=4;;
f28b6a
  *ELF\ 64-bit*shared\ object*Alpha*) C=;;
f28b6a
esac
f28b6a
readelf -Ws $1 | awk '
f28b6a
/\.dynsym.* contains/ { start=1 }
f28b6a
/^$/ { start=0 }
f28b6a
/  UND / { next }
f28b6a
/@/ { if (start) {
f28b6a
  fn=$8
f28b6a
  intfn="HACK" hack+0
f28b6a
  hack++
f28b6a
  if ($4 ~ /FUNC/) { print ".text"; size=16; print ".type " intfn ",@function" }
f28b6a
  else if ($4 ~ /TLS/) { print ".section .tdata,\"awT\", @progbits"; size=$3; print ".type " intfn ",@object" }
f28b6a
  else if ($5 ~ /UNIQUE/ && $4 ~ /OBJECT/) { print ".data"; size=$3; print ".type " intfn ",@gnu_unique_object" }
f28b6a
  else if ($4 ~ /OBJECT/) { print ".data"; size=$3; print ".type " intfn ",@object" }
f28b6a
  else if ($4 ~ /NOTYPE/) { print ".data"; size=$3 }
f28b6a
  else exit(1);
f28b6a
  print ".globl " intfn
f28b6a
  if ($5 ~ /WEAK/) { print ".weak " intfn }
f28b6a
  else if ($5 ~ /UNIQUE/ && $4 ~ /OBJECT/) {}
f28b6a
  else if ($5 !~ /GLOBAL/) exit(1);
f28b6a
  print intfn ": .skip " size
f28b6a
  print ".size " intfn "," size
f28b6a
  print ".symver " intfn "," fn
f28b6a
} }
f28b6a
' > $TMPDIR/lib.s || exit
f28b6a
soname=`readelf -Wd $1 | grep SONAME | sed 's/^.*\[//;s/\].*$//'`
f28b6a
gcc $C -shared -Wl,-soname,$soname,-version-script,$3 \
f28b6a
    -o $2 $TMPDIR/lib.s -nostdlib
f28b6a
strip $2
f28b6a
rm -rf $TMPDIR