Почему запуск под «make» изменяет адреса загрузки разделяемой библиотеки? - PullRequest
2 голосов
/ 07 февраля 2011

коллега обнаружил, что при запуске команды

java -Xmx1024m -version

из make-файла он получал сообщение 'Failed to instantiate heap; 1G requested'

Но запускал его из командыЛиния работает отлично.Это на SUSE Linux Enterprise Server 11 с использованием 32-битной JVM (64-битная работает нормально).

После дальнейшего исследования он обнаружил:

Обычно разделяемые библиотеки Java загружаютсяв конце адресного пространства процесса, поэтому адреса около 0x7 ... Если java запускается процессом make, библиотеки загружаются в середине адресного пространства, по адресам около 0x4 ....

Кто-нибудь знает, почему make вызывает загрузку библиотек в другом месте и есть ли способ предотвратить это?

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

Адрес загрузки является просто предпочтительным адресом загрузки.Если он уже сопоставлен и используется из-за другого so / dll, то so / dll перемещается.В любом случае с ASLR ситуация еще хуже, вы никогда не знаете, где материал виден в пространстве пользователя.

РЕДАКТИРОВАТЬ:

Я мог воспроизвести проблему с 2 ГБ (-Xmx2048m), но не знаю, чтотехнически это именно проблема.Я думаю, что это связано с тем, как процесс связан с созданием / как он порожден

jaap@ubuntu-desktop:~$ make
java -Xmx2048m -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
make: *** [all] Error 1
0 голосов
/ 14 июля 2016

Я видел аналогичный эффект и выявлял причину:

  • адрес загрузки для динамических библиотек, как правило, зависит от того, что mmap (0) выделяет.Итак, что здесь отличается, так это то, что ядро ​​помещает память в адрес процесса spcace.
  • ядро, используемое для выделения памяти из адресов с низким пользовательским пространством вверх, но переключено сверху вниз.См. https://lwn.net/Articles/91829/
  • , если подпроцесс запущен с RLIMIT_STACK, установленным в бесконечность, ядро ​​переключается на старое (унаследованное) распределение снизу вверх (унаследованный порядок также можно принудительно установить с помощью бита индивидуальности, но, вероятно, это не так.что здесь происходит).
  • в make 3.81 появилась ошибка, при которой он запускал подпроцессы с бесконечностью RLIMIT_STACK
  • , это было исправлено в make 3.82: https://savannah.gnu.org/bugs/?22010
  • в atхотя бы один коммерческий дистрибутив, make 3.81, но, похоже, к нему применено это исправление ошибки, и он не страдает от проблемы с порядком памяти.

Так что, если вы используете стандартный 3.81 make, это, вероятно, проблема,Если нет, то, возможно, что-то еще устанавливает RLIMIT_STACK в бесконечность в подпроцессе.Если это не RLIMIT_STACK, это может быть личность.Посмотрите на / proc / self / identity в командной строке и под make, и посмотрите, установлен ли бит 200000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...