Skip to content

Instantly share code, notes, and snippets.

@rouault
Created February 1, 2020 13:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rouault/5e92eb046b7c451b8b0071e9d765c9de to your computer and use it in GitHub Desktop.
Save rouault/5e92eb046b7c451b8b0071e9d765c9de to your computer and use it in GitHub Desktop.
patch_rasterio_whl.py
# 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