Когда используешь 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
Объектные файлы создаются pip install
, пакеты, включая numpy, sklearn, pandas, xgboost, numexpr. Что мы пытаемся сделать, так это сократить код и объектные файлы, чтобы они соответствовали лимиту AWS Lambda 250 МБ.
Поиск в Google находит ссылки на binutils в списках рассылки GNU, но большинство советов предназначены для разработчиков, создающих свой собственный код, а также для внесения изменений в файлы заголовков и т.п. Я подозреваю, что есть изменение конфигурации сборки, которое я могу внести при запуске 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
...
Некоторые пакеты 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