-
-
Save rouault/5e92eb046b7c451b8b0071e9d765c9de to your computer and use it in GitHub Desktop.
patch_rasterio_whl.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# wget https://files.pythonhosted.org/packages/29/cb/934ffe0dfdad9d229c4aa2ad14a9bdd4cca68f448cee2599744a64167618/rasterio-1.1.2-cp27-cp27mu-manylinux1_x86_64.whl | |
# unzip rasterio-1.1.2-cp27-cp27mu-manylinux1_x86_64.whl | |
# pip3 install --user lief | |
# python3 patch_rasterio_whl.py | |
import copy | |
import lief | |
import glob | |
import os.path | |
dirname = 'rasterio' | |
prefix_symb = '_rasterio_whl_' | |
libsdirname = os.path.join(dirname, '.libs') | |
rootlibname = 'libgdal-4653656c.so.20.5.3' | |
def get_deps_rec(lib): | |
deps = set(lib.libraries) | |
new_deps = copy.copy(deps) | |
for dep in deps: | |
sublib = lief.parse(os.path.join(libsdirname, dep)) | |
if sublib: | |
new_deps.update(get_deps_rec(sublib)) | |
return new_deps | |
print('Getting dependencies of ' + rootlibname) | |
lib = lief.parse(os.path.join(libsdirname, rootlibname)) | |
deps = get_deps_rec(lib) | |
del lib | |
deps.add(rootlibname) | |
print('Getting all symbols') | |
all_imported = set() | |
all_exported = set() | |
for dep in deps: | |
lib = lief.parse(os.path.join(libsdirname, dep)) | |
if lib: | |
all_imported.update(set(x.name for x in lib.imported_symbols)) | |
all_exported.update(set(x.name for x in lib.exported_symbols)) | |
symbols_from_system_libs = all_imported.difference(all_exported) | |
symbols_from_system_libs.add(".init") | |
symbols_from_system_libs.add(".fini") | |
#print(symbols_from_system_libs) | |
# Patch .libs | |
for name in deps: | |
lib = lief.parse(os.path.join(libsdirname, name)) | |
if lib: | |
print('Patching ' + name) | |
for x in lib.imported_symbols: | |
if x.name not in symbols_from_system_libs: | |
x.name = prefix_symb + x.name | |
for x in lib.exported_symbols: | |
if x.name not in symbols_from_system_libs: | |
x.name = prefix_symb + x.name | |
lib.write(os.path.join(libsdirname, name)) | |
# Patch module libs | |
for name in glob.glob(os.path.join(dirname, '*.so')): | |
print('Patching ' + name) | |
lib = lief.parse(name) | |
for x in lib.imported_symbols: | |
if x.name in all_exported: | |
x.name = prefix_symb + x.name | |
lib.write(name) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment