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