Update 'Obtaining the Oodle library on Linux'
parent
0e557df3ca
commit
ebe7d0517a
1 changed files with 104 additions and 0 deletions
104
Obtaining-the-Oodle-library-on-Linux.md
Normal file
104
Obtaining-the-Oodle-library-on-Linux.md
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
The Unreal Engine (currently v5.0.3) includes a version of the Oodle data compression library compiled for Linux (at `Engine/Source/Runtime/OodleDataCompression/Sdks/2.9.5/lib/Linux`). However, this archive was compiled for static linking, and all symbols were marked as hidden.
|
||||||
|
|
||||||
|
To be able to create a shared library from that, follow the steps described in [StackOverflow - Keep all exported symbols when creating a shared library from a static library](https://stackoverflow.com/questions/54664759/keep-all-exported-symbols-when-creating-a-shared-library-from-a-static-library):
|
||||||
|
|
||||||
|
**elf_unhide.py**:
|
||||||
|
```python
|
||||||
|
#!/usr/bin/python
|
||||||
|
# unhide.py - Replace hidden with default visibility on global symbols defined
|
||||||
|
# in an ELF object file
|
||||||
|
|
||||||
|
import argparse, sys, lief
|
||||||
|
from lief.ELF import SYMBOL_BINDINGS, SYMBOL_VISIBILITY, SYMBOL_TYPES
|
||||||
|
|
||||||
|
def warn(msg):
|
||||||
|
sys.stderr.write("WARNING: " + msg + "\n")
|
||||||
|
|
||||||
|
def unhide(objfile_in, objfile_out = None, namedsyms=None):
|
||||||
|
if not objfile_out:
|
||||||
|
objfile_out = objfile_in
|
||||||
|
binary = lief.parse(objfile_in)
|
||||||
|
allsyms = { sym.name for sym in binary.symbols }
|
||||||
|
selectedsyms = set([])
|
||||||
|
nasyms = { sym.name for sym in binary.symbols if \
|
||||||
|
sym.type == SYMBOL_TYPES.NOTYPE or \
|
||||||
|
sym.binding != SYMBOL_BINDINGS.GLOBAL or \
|
||||||
|
sym.visibility != SYMBOL_VISIBILITY.HIDDEN }
|
||||||
|
if namedsyms:
|
||||||
|
namedsyms = set(namedsyms)
|
||||||
|
nosyms = namedsyms - allsyms
|
||||||
|
for nosym in nosyms:
|
||||||
|
warn("No symbol " + nosym + " in " + objfile_in + ": ignored")
|
||||||
|
for sym in namedsyms & nasyms:
|
||||||
|
warn("Input symbol " + sym + \
|
||||||
|
" is not a hidden global symbol defined in " + objfile_in + \
|
||||||
|
": ignored")
|
||||||
|
selectedsyms = namedsyms - nosyms
|
||||||
|
else:
|
||||||
|
selectedsyms = allsyms
|
||||||
|
|
||||||
|
selectedsyms -= nasyms
|
||||||
|
unhidden = 0;
|
||||||
|
for sym in binary.symbols:
|
||||||
|
if sym.name in selectedsyms:
|
||||||
|
sym.visibility = SYMBOL_VISIBILITY.DEFAULT
|
||||||
|
unhidden += 1
|
||||||
|
print("Unhidden: " + sym.name)
|
||||||
|
print("{} symbols were unhidden".format(unhidden))
|
||||||
|
binary.write(objfile_out)
|
||||||
|
|
||||||
|
def get_args():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Replace hidden with default visibility on " + \
|
||||||
|
"global symbols defined in an ELF object file.")
|
||||||
|
parser.add_argument("ELFIN",help="ELF object file to read")
|
||||||
|
parser.add_argument("-s","--symbol",metavar="SYMBOL",action="append",
|
||||||
|
help="Unhide SYMBOL. " + \
|
||||||
|
"If unspecified, unhide all hidden global symbols defined in ELFIN")
|
||||||
|
parser.add_argument("--symfile",
|
||||||
|
help="File of whitespace-delimited symbols to unhide")
|
||||||
|
parser.add_argument("-o","--out",metavar="ELFOUT",
|
||||||
|
help="ELF object file to write. If unspecified, rewrite ELFIN")
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = get_args()
|
||||||
|
objfile_in = args.ELFIN
|
||||||
|
objfile_out = args.out
|
||||||
|
symlist = args.symbol
|
||||||
|
if not symlist:
|
||||||
|
symlist = []
|
||||||
|
symfile = args.symfile
|
||||||
|
if symfile:
|
||||||
|
with open(symfile,"r") as fh:
|
||||||
|
symlist += [word for line in fh for word in line.split()]
|
||||||
|
unhide(objfile_in,objfile_out,symlist)
|
||||||
|
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
|
||||||
|
**elf_unhide.sh**:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
TEMP=$(mktemp -d)
|
||||||
|
|
||||||
|
OLD_ARCHIVE="$(realpath "$1")"
|
||||||
|
NEW_ARCHIVE="$(realpath "$2")"
|
||||||
|
|
||||||
|
ar --output $TEMP xv $OLD_ARCHIVE
|
||||||
|
|
||||||
|
find $TEMP -type f -exec ./elf_unhide.py --symfile symbols.txt "{}" \;
|
||||||
|
|
||||||
|
ar rcs $NEW_ARCHIVE $TEMP/*.o
|
||||||
|
|
||||||
|
rm -r $TEMP
|
||||||
|
echo "$(basefile $NEW_ARCHIVE) made"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Create the shared library**:
|
||||||
|
```shell
|
||||||
|
./elf_unhide.sh liboo2corelinux64.a liboo2corelinux64_out.a
|
||||||
|
g++ -shared -o liboo2corelinux64.so -Wl,--whole-archive ./liboo2corelinux64_out.a -Wl,--no-whole-archive
|
||||||
|
```
|
Loading…
Add table
Reference in a new issue