在Ubuntu 12.04中导入python2.7中的Tensorflow时出错。 'GLIBC_2.17找不到'
我已成功安装了与python的Tensorflow绑定。 但是当我尝试导入Tensorflow时,出现以下错误。
ImportError:找不到/lib/x86_64-linux-gnu/libc.so.6:'GLIBC_2.17'版本(/usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so )
我试图更新GLIBC_2.15到2.17,但没有运气。
我有同样的问题,所以使用Googlesearch我做了这些步骤:
$ sudo pip install --upgrade virtualenv $ virtualenv --system-site-packages ~/tensorflow $ cd ~/tensorflow $ source bin/activate $ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl $ cd /tmp $ wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb $ wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb $ mkdir libc6_2.17 $ cd libc6_2.17 $ ar p ../libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx $ ar p ../libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx $ cd - $ LD_LIBRARY_PATH=/tmp/libc6_2.17/lib/x86_64-linux-gnu/ /tmp/libc6_2.17/lib/x86_64-linux-gnu/ld-2.17.so bin/python local/lib/python2.7/site-packages/tensorflow/models/image/mnist/convolutional.py
并退出:
$ deactivate
这对我行得通。
我试过BR_User解决scheme ,仍然有一个恼人的:
ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found
我在CentOS 6.7上,它也缺less一个更新的c ++标准库,所以build立在BR_User解决scheme上,我提取了正确的libstdc ++包,但是我发现不需要虚拟环境。
假设你已经安装了tensorflow,它会给出:
mkdir ~/my_libc_env cd ~/my_libc_env wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb wget ftp://rpmfind.net/linux/sourceforge/m/ma/magicspecs/apt/3.0/x86_64/RPMS.lib/libstdc++-4.8.2-7mgc30.x86_64.rpm ar p libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx ar p libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx rpm2cpio libstdc++-4.8.2-7mgc30.x86_64.rpm| cpio -idmv
然后运行python:
LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/usr/lib64/" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`
如果它不起作用,我有另一种解决scheme ,但你不会喜欢它。
好的,这里是我在之前的回答中提到的另一个解决scheme,它比较棘手,但是应该始终在GLIBC> = 2.12和GLIBCXX> = 3.4.13的系统上工作。 在我的情况下,它是在CentOS 6.7上,但对于Ubuntu 12.04也是好的。
我们需要一个支持c ++ 11的gcc版本,可以在另一台机器上或者单独安装; 但暂时不行。
我们在这里要做的是编辑_pywrap_tensorflow.so二进制文件,以便“弱化”libc和libstdc ++依赖项,以便ld接受连接我们要创build的存根。 然后,我们将为缺less的符号创build这些存根,最后我们将在运行python时预加载所有这些。
首先,我要感谢詹姆斯的伟大的文章( http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc )和宝贵的build议,我不能没有他。
所以,让我们开始减弱依赖关系,只是在_pywrap_tensorflow.so中replace正确的字节。 请注意,此步骤仅适用于当前版本的张量stream(0.6.0)。 所以如果没有完成创build和激活你的virtualenv,如果你有一个(如果你不是pipe理virtualenv是一个解决scheme,另一个是添加 – 用户标志到PIP命令),并安装tensorflow 0.6.0(replaceCPU gpu在url,如果你想要的GPU版本):
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl
让我们弱化所有烦人的依赖关系,这里是tensorflow的cpu版本的命令:
TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"` for addr in 0xC6A93C 0xC6A99C 0xC6A9EC 0xC6AA0C 0xC6AA1C 0xC6AA3C; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done
这里是一个GPU(只运行正确的,否则你会破坏二进制):
TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"` for addr in 0xDC5EA4 0xDC5F04 0xDC5F54 0xDC5F74 0xDC5F84 0xDC5FA4; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done
你可以检查它:
readelf -V ${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so
看看这篇文章,如果你想了解这里发生了什么。
现在我们将为缺less的libc符号创build存根:
mkdir ~/my_stubs cd ~/my_stubs MYSTUBS=~/my_stubs printf "#include <time.h>\n#include <string.h>\nvoid* memcpy(void *dest, const void *src, size_t n) {\nreturn memmove(dest, src, n);\n}\nint clock_gettime(clockid_t clk_id, struct timespec *tp) {\nreturn clock_gettime(clk_id, tp);\n}" > mylibc.c gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c
您需要在缺less依赖关系的计算机上执行该步骤(或者具有类似版本的标准库的机器(例如在群集中))。
现在我们可能会改变机器,因为我们需要一个支持c ++ 11的gcc,而且它可能不在机器上缺less所有的依赖(或者你可以使用一个最近的gcc的独立安装)。 在下面,我假设我们还在~/my_stubs
,不知何故,你在机器上分享你的家,否则你只需要复制我们在完成时生成的.so文件。
所以,我们可以为libstdc ++做一个存根,剩下的就是我们要从gcc源代码编译它们(克隆存储库可能需要一些时间):
printf "#include <functional>\nvoid std::__throw_bad_function_call(void) {\nexit(1);\n}" > bad_function.cc gcc -std=c++11 -s -shared -o bad_function.so -fPIC -fno-builtin bad_function.cc git clone https://github.com/gcc-mirror/gcc.git cd gcc mkdir my_include mkdir my_include/ext cp libstdc++-v3/include/ext/aligned_buffer.h my_include/ext gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hashtable.so -fPIC -fno-builtin libstdc++-v3/src/c++11/hashtable_c++0x.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/chrono.so -fPIC -fno-builtin libstdc++-v3/src/c++11/chrono.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/random.so -fPIC -fno-builtin libstdc++-v3/src/c++11/random.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hash_bytes.so -fPIC -fno-builtin ./libstdc++-v3/libsupc++/hash_bytes.cc
而就是这样! 您现在可以通过预加载我们所有的共享库(以及您的本地libstdc ++)来运行tensorflow python脚本:
LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4` #For 64bit machines LD_PRELOAD="$MYSTUBS/mylibc.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py
🙂
我刚刚在CentOS 6.5上用glibc 2.12安装了tensorflow 0.12rc0,没有root权限。 通过pip简单地安装tensorflow二进制文件给我一个错误,也与GLIBC版本有关。
基本上,你有4个选项如何处理这个(每个有一些优点和缺点):
选项1 – 全球升级您的系统GLIBC。
这可能是最好的select, 如果你的系统支持这个 ,你有root权限,并且你确信这个升级不会因为某种奇怪的原因而破坏任何东西。 最终,这升级了整个Linux发行版。 这里是stream行发行版的默认GLIBC版本的简短列表。
选项2 – 将第二个GLIBC添加到您的系统
编译或下载二进制文件 。 最简单和直接的select。 特别是如果你只需要运行几个简单的脚本 。
- 在同一个系统上可能有多个版本的glibc,但是应该非常小心的做到这一点。
- 如果您所做的更改仅限于虚拟环境,则不会破坏您的系统。
- 以前安装/编译的许多程序可能依赖于旧的GLIBC, 只会在新的环境中崩溃 (例如,您的Python IDE)。 包括最基本的bash命令,如“lc”,“cd”等
- 其他副作用如重大的内存泄漏也是可能的。
- 因此, 将新的GLIBC添加到常规环境中是一个非常糟糕的主意,例如通过
.bashrc
。 - 另一方面,如果你在新的虚拟环境中需要一些特定的工具,你可以重新编译它,链接到新的GLIBC 。 所以,在你的新环境中,这样做还是可以的。
- 但是,个人而言,我很快放弃了在新环境下重新编译我所需要的一切(没有root和一个包pipe理器)。
- GLIBC开发人员正式提供了一种稍微不同的方法来testing新的GLIBC版本。
选项3 – 补丁tensorflow
这可能适用于TF 0.6.0,但是当每个新的tensorflow版本发布时,您可能不得不重新开始。 例如这里是一个0.9.0的修复。
选项4 – 从源编译tensorflow
如果你从源代码重新编译它并且链接到现有的GLIBC,那么不再需要更新的GLIBC。 不知何故,这个选项在这里没有提到任何答案。 Imho,这是最好的select,“ 一般 ”,“专为tensorflow”。
- 这对于r0.11是行得通的,可能会工作多年,但理论上,如果他们决定实际使用一些新的GLIBCfunction,而不是旧版本,它可能会在一些新的张量stream版本中打破。
- 说实话,从源头上构buildtensorflow并不简单,特别是在过时的系统上。
“build立过时系统张量”的快速总结
虽然官方指南提供了“ 从源代码安装 ”部分,但是在过时的系统上构build它需要做很less的技巧。 在这里,我假设你没有root权限(如果你这么做的话 – 你可能会用一个包pipe理器来安装相同的预先请求,而不是从源代码手动构build它们)。
我发现了两个有据可查的成功案例: #1 , #2和官方github上的许多有用的post(主要是关于二进制内部链接的一组库): #1 , #2 , #3 , #4 。 我必须结合技巧,在那里描述成功编译TF在我的情况。
-
首先,检查你的
gcc --version
,并确认它支持c ++ 11。 矿是4.4.7,所以它不会工作。 我已经下载了 gcc-4.9.4源代码,并编译它 。 这一步很简单,但编译本身可能需要几个小时。 作为bazel中的一个问题的解决方法,我已经编译了gcc, 硬编码的path为as
,ld
和nm
。 但是,您可以尝试另一种解决方法:( 1,2 )。#!/bin/sh unset LIBRARY_PATH CPATH C_INCLUDE_PATH unset PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH cd gcc-4.9.4 ./contrib/download_prerequisites mkdir objdir cd objdir # I've added --disable-multilib to fix the following error: # /usr/bin/ld: crt1.o: No such file: No such file or directory # collect2: ld returned 1 exit status # configure: error: I suspect your system does not have 32-bit # developement libraries (libc and headers). If you have them, # rerun configure with --enable-multilib. If you do not have them, # and want to build a 64-bit-only compiler, rerun configure # with --disable-multilib. ../configure --prefix=$HOME/opt/gcc-4.9.4 \ --disable-multilib \ --disable-nls \ --enable-languages=c,c++ \ --with-ld=/usr/bin/ld \ --with-nm=/usr/bin/nm \ --with-as=/usr/bin/as make make install
-
检查你的
java --version
。 Bazel需要JDK 8,如果需要的话安装。 (他们仍然提供一些jdk7相关的下载,对于bazel-0.4.1,但看起来他们认为这已经被弃用了) -
我创build了一个单独的
use_gcc_4.9.4.sh
文件,其中包含必要的环境variables。 当我需要与这个新的编译器相关的东西时,我使用source ./use_gcc_4.9.4.sh
。#!/bin/sh this=$HOME/opt/gcc-4.9.4 export PATH=$this/bin:$PATH export CPATH=$this/include:$CPATH export LIBRARY_PATH=$this/lib:$LIBRARY_PATH export LIBRARY_PATH=$this/lib64:$LIBRARY_PATH export LD_LIBRARY_PATH=$this/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=$this/lib64:$LD_LIBRARY_PATH
-
当前的bazel二进制(0.4.1) 需要GLIBC 2.14 ,所以我们必须从源代码编译bazel (使用我们的新gcc)。 工作正常,除非您只允许在目标机器上运行非常有限数量的线程 。 ( 这篇文章介绍了一些额外的解决方法,但在我的情况下,他们并不需要,也许是由于bazel代码最近的更新。)
-
获取张量stream源代码
git clone https://github.com/tensorflow/tensorflow
,并安装你需要的先决条件(CUDA,cuDNN,python等)。 见官方指南 。 -
如果你没有使用默认的系统gcc(例如,如果你不得不编译新的gcc,就像上面讨论的那样),将下面的链接标志添加到
tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl
, 第59行 :linker_flag: "-L/home/username/localinst/opt/gcc-4.9.4/lib64" linker_flag: "-Wl,-rpath,/home/username/localinst/opt/gcc-4.9.4/lib64"
没有这一步,你可能会遇到像这样的错误消息:
# ERROR: /home/username/localdistr/src/tensorflow/tensorflow/tensorflow/core/debug/BUILD:33:1: null failed: protoc failed: error executing command bazel-out/host/bin/external/protobuf/protoc '--cpp_out=bazel-out/local_linux-py3-opt/genfiles/' '--plugin=protoc-gen-grpc=bazel-out/host/bin/external/grpc/grpc_cpp_plugin' ... (remaining 8 argument(s) skipped): com.google.devtools.build.lib.shell.BadExitStatusException: Process exited with status 1. # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by bazel-out/host/bin/external/protobuf/protoc) # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by bazel-out/host/bin/external/protobuf/protoc) # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by bazel-out/host/bin/external/protobuf/protoc)
-
最后,为了避免GLIBC依赖,我们必须通过添加
-lrt
链接器标志( 也许是-lm
)来静态链接一些库。 我发现多个post,build议以不同的方式添加这个post:- 通过bazel命令行 (可能听起来合理,但不适合当前tensorflow版本,我不知道),
- 通过“bazel-tensorflow / external / protobuf / BUILD” (不知道它是否工作,但这看起来不太方便 – 这个文件只在构build尝试本身时创build)
-
通过“third_party / gpus / crosstool / CROSSTOOL.tpl” (我们刚刚在上一步中编辑过的同一个文件,就在我们已经添加的行的下面)。
linker_flag: "-lrt" linker_flag: "-lm"
-
通过“tensorflow / tensorflow.bzl” (适用于我,但不太方便,因为你必须编辑一个文件,我不确定它是否与前一点相当)
没有
-lrt
我再次遇到GLIBC版本特定的错误,试图import tensorflow
:# ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/username/anaconda3/envs/myenvname/lib/python3.5/site-packages/tensorflow/python/_pywrap_tensorflow.so)
没有
-lm
你可能会遇到这个 (对我来说,事实certificate这是没有必要的)。 -
运行构build过程。
source ./use_gcc_4.9.4.sh ./configure bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg pip install --upgrade /tmp/tensorflow_pkg/tensorflow-0.12.0rc0-cp35-cp35m-linux_x86_64.whl
-
尝试运行以下简单的python脚本来testing最基本的东西是否正常运行:
import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') sess = tf.Session() print(sess.run(hello)) a = tf.constant(10) b = tf.constant(32) print(sess.run(a + b))
如果你的GNU C库不是最新的,那么这个错误主要是出现的。 您可以使用简单的方式来检查您正在运行的版本
$ ldd --version
输出应该是这样的:
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Roland McGrath and Ulrich Drepper.
2.19是你的GLIBC版本。 要升级,您可以访问GNU-C Library项目网站并下载最新版本。 最新glibc的链接在这里: GNU-C库下载在写这个答案的时候, 最新的稳定版本是2.22 。
我试过在Ubuntu 12.04和14.04上运行tensorflow。 Ubuntu 14.04不会抛出这个问题,因为它默认安装了glibc 2.19。
希望它有帮助。
我的解决scheme与Theo T类似, 虽然微调了Xubuntu 12.04(CAELinux 2013)
sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl sudo su # prompt for password TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"` for addr in 0xC6A93C 0xC6A99C 0xC6A9EC 0xC6AA0C 0xC6AA1C 0xC6AA3C; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done readelf -V ${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so exit mkdir ~/.my_stubs cd ~/.my_stubs MYSTUBS=~/.my_stubs printf "#include <time.h>\n#include <string.h>\nvoid* memcpy(void *dest, const void *src, size_t n) {\nreturn memmove(dest, src, n);\n}\nint clock_gettime(clockid_t clk_id, struct timespec *tp) {\nreturn clock_gettime(clk_id, tp);\n}" > mylibc.c gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c printf "#include <functional>\nvoid std::__throw_bad_function_call(void) {\nexit(1);\n}" > bad_function.cc gcc -std=c++11 -s -shared -o bad_function.so -fPIC -fno-builtin bad_function.cc git clone https://github.com/gcc-mirror/gcc.git cd gcc mkdir my_include mkdir my_include/ext cp libstdc++-v3/include/ext/aligned_buffer.h my_include/ext gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hashtable.so -fPIC -fno-builtin libstdc++-v3/src/c++11/hashtable_c++0x.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/chrono.so -fPIC -fno-builtin libstdc++-v3/src/c++11/chrono.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/random.so -fPIC -fno-builtin libstdc++-v3/src/c++11/random.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hash_bytes.so -fPIC -fno-builtin ./libstdc++-v3/libsupc++/hash_bytes.cc
以下两个步骤将运行位于tensorflow / models / image / mnist目录中的convolution.py脚本:
LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4` #For 64bit machines LD_PRELOAD="$MYSTUBS/mylibc.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py
如果你想让python始终加载这些简化的依赖关系,只需使用以下步骤将其添加到.bashrc文件中:
echo "LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4`" >> ~/.bashrc echo alias python="'"LD_PRELOAD='"''$'MYSTUBS/mylibc.so:'$'MYSTUBS/random.so:'$'MYSTUBS/hash_bytes.so:'$'MYSTUBS/chrono.so:'$'MYSTUBS/hashtable.so:'$'MYSTUBS/bad_function.so:'$'LIBSTDCPP'"' python"'" >> ~/.bashrc
如果你有ipython:
echo alias ipython="'"LD_PRELOAD='"''$'MYSTUBS/mylibc.so:'$'MYSTUBS/random.so:'$'MYSTUBS/hash_bytes.so:'$'MYSTUBS/chrono.so:'$'MYSTUBS/hashtable.so:'$'MYSTUBS/bad_function.so:'$'LIBSTDCPP'"' ipython"'" >> ~/.bashrc
基本上,我更新到python安装在dist_packages而不是站点包完成。 另外,我从gcc镜像克隆而不是gcc的本地git页面。 rest都是一样的。
最后几个步骤确保每次运行python或ipython时,它都会加载减less的依赖关系。
@ThéoT的答案中的链接不再有效,所以我不得不尝试几种方法来find一个可行的方法。
mkdir ~/my_libc_env cd ~/my_libc_env wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb wget ftp://ftp.icm.edu.pl/vol/rzm5/linux-slc/centos/7.0.1406/cr/x86_64/Packages/libstdc++-4.8.3-9.el7.x86_64.rpm ar p libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx ar p libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx rpm2cpio libstdc++-4.8.3-9.el7.x86_64.rpm| cpio -idmv
用tensorflow运行python代码
LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/usr/lib64/" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python` your_program.py
注意Theo Trouillon的“弱化”解决scheme。 它只适用于Tensorflow 0.6.0。 如果您想将其应用于Tensorflow 0.9.0,则会变得棘手。 我的情况是CPU模式,Centos 6.7,其中GLIBC 2.12 GLIBCXX 3.4.13。
安装tensorflow:
pip uninstall protobuf pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
“弱化”的代码应该改变:
TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"` for addr in 0x376e34 0x376e94 0x376ef4 0x376f14 0x376f24 0x376f44 0x376f54 ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done for addr in 0x93aa4 0x93b04 ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/layers/python/ops/_bucketization_op.so bs=1 seek=$((addr)) ; done for addr in 0x95bec 0x95c4c ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/layers/python/ops/_sparse_feature_cross_op.so bs=1 seek=$((addr)) ; done for addr in 0x9ffec 0x9fffc 0xa005c ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/metrics/python/ops/_set_ops.so bs=1 seek=$((addr)) ; done for addr in 0x96aa4 0x96b04 0x96b24; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/linear_optimizer/python/ops/_sdca_ops.so bs=1 seek=$((addr)) ; done
下面的代码应该被添加到新机器的存根生成代码。
mkdir my_include/bits cp libstdc++-v3/include/bits/shared_ptr_atomic.h my_include/bits/ cp libstdc++-v3/include/std/memory my_include/ gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/shared_ptr.so -fPIC -fno-builtin ./libstdc++-v3/src/c++11/shared_ptr.cc gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/list.so -fPIC -fno-builtin ./libstdc++-v3/src/c++98/list.cc echo " #include <unistd.h> #include <stdlib.h> char * secure_getenv (const char *name) { if ((getuid () == geteuid ()) && (getgid () == getegid ())) return getenv (name); else return NULL; }" > getenv.cc gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/getenv.so -fPIC -fno-builtin getenv.cc
当然,最后的运行代码应该被修改以包含额外的存根。
LD_PRELOAD="$MYSTUBS/list.so:$MYSTUBS/mylibc.so:$MYSTUBS/shared_ptr.so:$MYSTUBS/getenv.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py
我已经尝试了https://stackoverflow.com/a/34897674/5929065解决scheme,它的工作完美。; 但是,libstdc ++ – 4.8.2-7下载链接不能再被访问,请尝试从这个页面中选取一个新链接: http ://rpm.pbone.net/index.php3/stat/4/idpl/31981489/dir /centos_7/com/libstdc++-4.8.5-4.el7.x86_64.rpm.html
对我来说,我用这个:
注意:你应该通过你的平台下载deb包:
86:
https://launchpad.net/ubuntu/raring/i386/libc6/2.17-0ubuntu5.1
wget http://launchpadlibrarian.net/151932048/libc6_2.17-0ubuntu5.1_i386.deb sudo dpkg -i libc6_2.17-0ubuntu5.1_i386.deb
64位:
https://launchpad.net/ubuntu/raring/amd64/libc6/2.17-0ubuntu5.1
wget http://launchpadlibrarian.net/151925896/libc6_2.17-0ubuntu5.1_amd64.deb sudo dpkg -i libc6_2.17-0ubuntu5.1_amd64.deb
testing我的12.04 Ubuntu x64。
上面的答案没有问题,但是在做完之后我仍然遇到一些问题。 我跟在@Theo回答在rhel和我试图导出LD_LIBRARY_PATH哪些已经引发了一些错误,随着LD_LIBRARY_PATH还包括LD_PRELOAD作为
mkdir libstdc cd libstdc rpm2cpio ../libstdc++-4.8.3-9.el7.x86_64.rpm| cpio -idmv LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/lib64/" LD_PRELOAD="$HOME/my_libc_env/libstdc/usr/lib64/libstdc++.so.6.0.19" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`
你必须在运行python的时候总是这么做,所以创build一个加载这些variables并调用python解释器的脚本
vim tmp.sh LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/lib64/" LD_PRELOAD="$HOME/my_libc_env/libstdc/usr/lib64/libstdc++.so.6.0.19" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`