strip
在 Amazon Linux 中 使用某些目标文件时,会出现以下错误:
$ sudo strip dfitpack.so BFD: st6qqyd2: Not enough room for program headers, try linking with -N strip:st6qqyd2[.note.gnu.build-id]: Bad value
目标文件由 、 numpy、sklearn、pandas、xgboost、numexpr 等包创建pip install
。我们试图精简代码和目标文件,以适应 AWS Lambda 250MB 的限制。
通过 google 搜索,可以在 GNU 邮件列表中找到对 binutils 的引用,但大多数提示都是针对开发人员构建自己的代码以及对头文件等进行更改。我怀疑在运行时我可以进行构建配置更改pip install
,并希望对 binutils 有更深入理解的人可以提供帮助。
眼镜:
$ uname -a Linux ... 4.4.5-15.26.amzn1.x86_64 #1 SMP Wed Mar 16 17:15:34 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ yum info binutils ... Version : 2.23.52.0.1 Release : 55.65.amzn1 ...
答案1
一些 pip 软件包(或其依赖项)会下载二进制文件,而不是下载源代码并在本地计算机上构建,因此在不同环境中构建的二进制文件上运行 strip 时可能会出现问题。要下载源代码并在本地计算机上构建,请尝试:
CFLAGS='-O0' pip install --no-binary :all: PACKAGE
请参阅 pip 文档https://pip.pypa.io/en/stable/reference/pip_install/#install-no-binary
在构建 Debian 软件包时曾讨论过这个问题https://github.com/spotify/dh-virtualenv/issues/150
请注意,某些二进制文件可能无法使用优化标志构建,因此请设置 CFLAGS 以禁用优化标志,请参阅: https://stackoverflow.com/questions/16149613/installing-lxml-with-pip-in-virtualenv-ubuntu-12-10-error-command-gcc-failed
还要注意,从源代码构建所有依赖项可能需要很长时间,因此如果您有时间整理哪些包有问题,哪些没有问题,并且想要加快构建速度,您可以尝试这个配方的一些变体,只从源代码安装一些具有不同优化级别的包:
CFLAGS='-O0' pip install --no-binary :all: PACKAGE
pip install --no-binary :all: PACKAGE
pip install PACKAGE