有没有什么好方法可以制作小的haskell可执行文件?使用ghc6,一个简单的hello world程序似乎达到了370kB(在strip之前为523kB).C中的Hello世界大约是4kB(剥离前9kB).
我必须在当前的ubuntu(12.04)上编译程序.然后,该程序应使用具有较旧内核(2.6.18)的CentOS在集群上运行.不幸的是,我不能直接在集群上编译.如果我只是编译并复制程序而没有任何更改,我会收到错误消息"kernel too old".
我理解它的方式,其原因不是内核版本,而是用于编译的libc版本.所以我尝试编译我的程序动态链接集群中的libc并静态链接其他所有内容.
研究
在SO上已经有很多关于这方面的问题,但没有一个答案对我有用.所以这是我对该主题的研究:
-rpath,但是这并没有为我工作(见下文)当前状态
我将以下文件从群集复制到目录中 /path/to/copied/libs
并正在编译选项 -nodefaultlibs -Xlinker -rpath=/path/to/copied/libs -Wl,-Bstatic,-lrt,-lboost_system,-lboost_filesystem -Wl,-Bdynamic,-lc,-lstdc++,-lgcc_s
编译二进制文件的ldd输出是
mybin: /path/to/copied/libs/libc.so.6: version `GLIBC_2.14' not found (required by mybin)
mybin: /path/to/copied/libs/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mybin)
linux-vdso.so.1 => (0x00007ffff36bb000)
libc.so.6 => /path/to/copied/libs/libc.so.6 (0x00007fbe3789a000)
libstdc++.so.6 => /path/to/copied/libs/libstdc++.so.6 (0x00007fbe37599000)
libgcc_s.so.1 => /path/to/copied/libs/libgcc_s.so.1 (0x00007fbe3738b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe37bf3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe37071000)
Run Code Online (Sandbox Code Playgroud)
我对这个错误感到有些困惑,因为它使用了正确的路径(即集群中的libc),但仍然抱怨缺少glibc版本.在群集上运行ldd时,它返回not a dynamic executable并运行二进制文件会产生上述相同的两个错误.它看起来还包括其他库(linux-vdso.so.1,ld-linux-x86-64.so.2和libm.so.6).我也应该使用旧版本吗? …
如何删除动态依赖libgmp并从中继续:
linux-vdso.so.1 => (0x00007fffdccb1000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fb01afc1000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000)
Run Code Online (Sandbox Code Playgroud)
对此(目前需要):
linux-vdso.so.1 => (0x00007fffdccb1000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000)
Run Code Online (Sandbox Code Playgroud)
以干净,可移植的方式适用于所有GNU/Linux发行版(而不是搞乱BSD(包括OS X))?
在分发针对多个GNU/Linux发行版的单个Haskell二进制文件时,您是否看到任何其他可能导致当前所需列表中存在问题的依赖项?
笔记:
libgmp.a不起作用(如何有选择地将某些系统库静态链接到Haskell程序二进制文件?)libgmp仍然在ldd输出中列出.我在节点js工作.我已经安装了鹰嘴豆泥包.它安装得当.我正在使用此包修改pdf文件.在下载pdf时我称之为鹰嘴豆泥.Onclick下载我收到此错误.
Error: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /var/www/html/node_modules/hummus/binding/hummus.node)
at Object.Module._extensions..node (module.js:681:18)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/var/www/html/node_modules/hummus/hummus.js:5:31)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at /var/www/html/app/routes.js:2250:18
at Layer.handle [as handle_request] (/var/www/html/node_modules/express/lib/router/layer.js:95:5)
Run Code Online (Sandbox Code Playgroud)
在这个链接的帮助下,我更新了glibc.但我仍然得到同样的错误.请帮我找出问题所在.我正在使用CentOs 6.9
似乎glibc 2.14引入了新版本memcpy(修复bug 12518).然后,针对glibc 2.14+编译的程序将包含动态链接memcpy@GLIBC_2.14,这在旧版本的glibc中显然不可用.
但是,glibc 2.14+显然仍然包含旧memcpy@GLIBC_2.2.5符号以实现向后兼容.我希望能够以这样的方式编译一些程序,使它们与旧的glibc版本二进制兼容.如何在具有glibc 2.14+的系统上编译程序,以便它使用这个旧的符号版本?如果该过程必然是特定于编译器的,那么我正在使用GCC(但是知道如何在其他编译器上执行它也会很好).
(在一个侧面说明,我必须承认不知道一大堆有关版本的符号,比如如何产生,以及如何使用它们,或者他们是否是ELF特定的或应被认为是现代的ABI标准的一部分;我还没有找到任何关于它的文件.关于这个问题,有没有很好的信息来源?)
我的问题源于我给出的共享库,没有重新编译库的选项.错误说明undefined reference to memcpy@GLIBC_2.14.
我机器上的GLIBC版本是2.12.我见过人们使用该线路在线完成的修复工作
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
Run Code Online (Sandbox Code Playgroud)
我做的修复是使用十六进制编辑器将2.14的引用更改为GLIBC_2.2.5.执行命令时readelf -V lib_name.so,输出更改为:
0x0060 Name: GLIBC_2.14 Flags: none Version 6
......
0x0080 Name: GLIBC_2.2.5 Flags: none Version 4
Run Code Online (Sandbox Code Playgroud)
至:
0x0060 Name: GLIBC_2.2.5 Flags: none Version 6
......
0x0080 Name: GLIBC_2.2.5 Flags: none Version 4
Run Code Online (Sandbox Code Playgroud)
这解决了我的错误.我想知道的是它会产生什么样的影响.我曾尝试研究的memcpy对比的memmove与memcpy的在GLIBC_2.14开始的变更,但我不太明白是怎么回事,什么原问题的memcpy了.我担心这个"修复",虽然它允许我的程序运行,以防memcpy正在做的事情表现不正常.为什么我在网上看到的所有修复程序都专门链接到2.2.5版本?
如果有人能给我一些关于这个主题的见解或提供一些相关信息的链接,我将不胜感激.
我试图在linux服务器上安装tensorflow,我只是一个没有root权限的用户.当我通过跳转服务器ssh到它时,我无法传输文件.系统如下:
Linux THENAME_OF_SURVER 2.6.32-573.18.1.el6.x86_64 #1 SMP Tue Feb 9 22:46:17 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
我安装了tensorflow pip install tensorflow,一个tensorflow程序将显示以下内容:
ImportError: /lib64/libc.so.6: version `GLIBC_2.16' not found
我安装了新版本的glibc
git clone git://sourceware.org/git/glibc.git
cd glibc
git checkout --track -b local_glibc-2.16 origin/release/2.16/master
mkdir build
cd build
../configure --prefix=/home/MYNAME/dependency/glibc-2.16
make -j4
make install
按照在线说明,我通过以下方式更改了环境变量:
export LD_LIBRARY_PATH=/home/MYNAME/dependency/glibc-2.16/lib
但这导致我遇到一个问题:我不能使用任何命令.例如,我打电话给ls它会像这样警告我:
ls: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
然后我按照另一条指令运行命令,如下所示:
/home/MYNAME/dependency/glibc-2.16/lib/ld-linux-x86-64.so.2 --library-path /home/MYNAME/dependency/glibc-2.16/lib:$LD_LIBRARY_PATH:/path/to/gcc-5.2.0/lib64:/usr/lib64/:/usr/lib64/ ls
(我不知道在哪里找到类似的文件夹gcc-5.2.0,我的which gcc节目/usr/local/sbin/gcc …
将构建环境升级到Ubuntu 14.4后,主可执行文件拒绝在具有较旧Linux版本的主机上启动,并显示以下消息:
/lib/i386-linux-gnu/libc.so.6:找不到版本`GLIBC_2.16'(./executable_name要求)
为了安全地将我的包分发给具有旧Glibc的主机,我应该尝试:
注意: - 我不需要使用旧版Ubuntu中的任何二进制文件 - 我不需要在较旧的Ubuntu版本上构建