Запуск исполняемых файлов ARM (EL) в системе ARM (HF) - Отсутствует Symlink для динамического загрузчика?

Я использую дистрибутив Ubuntu 12.10 (ARMHF) на доске для панд. Я хочу запускать приложения, скомпилированные для ARMEL. Это было невозможно из-за изменения местоположения динамического загрузчика ( https://wiki.linaro.org/OfficeofCTO/HardFloat/LinkerPathCallApr2012 )

Мне удалось создать следующую символическую ссылку / lib /ld-linux.so.3 -> /lib/ld-linuxarmhf.so.3

Можно ли вместо этого установить пакет переносимости? Есть ли причина, по которой дистрибутив этого не делает?

Заранее спасибо

5
задан 8 January 2013 в 04:06

2 ответа

Возможно, такого пакета совместимости не существует (для запуска старых сторонних двоичных файлов armhf, ожидающих /lib/ld-linux.so.3 вместо нового стандарта, согласованного в /lib/ld-linuxarmhf.so.3, верно?), Потому что этот пакет (если установлено) даст "ложное обещание", чтобы удовлетворить любые двоичные файлы Armel. Но динамический компоновщик armhf должен ломать двоичные файлы armel, потому что ABI несовместимы, если я правильно понимаю. (В этом случае правильным решением было бы обернуть несколько специальных нестандартных двоичных файлов armhf так, чтобы ожидаемое расположение динамического компоновщика было адаптировано для вашей системы. Или переписать это значение в двоичные файлы. Если это возможно. Тогда это не вызовет никаких проблем, когда вы попытаетесь запустить настоящие двоичные файлы armel.)

С другой стороны, если вы хотите запустить настоящие двоичные файлы armel в системе armhf, вам нужно просто перейти к «multiarch» (и, следовательно, используйте реальный динамический компоновщик armel вместо символической ссылки!): Установите предварительные условия armel для ваших двоичных файлов armel. Среди предварительных условий libc6:armel или тому подобное (исправьте имя pkg, если я ошибаюсь, пожалуйста) обязательно включит необходимое /lib/ld-linux.so.3.

(Относительно несовместимости ABI: как я мог понять, в armhf аргументы с плавающей запятой передаются непосредственно в регистры с плавающей запятой, тогда как в armel они передаются в целочисленных регистрах. Это косвенное добавление добавляет ARM дополнительную стоимость которые поддерживают с плавающей точкой, поэтому armhf лучше для современного ARM.)

0
ответ дан 8 January 2013 в 04:06

Динамический компоновщик запекается во время компиляции. чтобы увидеть, какой динамический компоновщик используется, запустите. readelf -l /usr/bin/foo | grep Request

Единственный способ изменить это - настроить файлы спецификации gcc. Смотри gcc -dumpspecs | grep ld-linux. Или, передав флаг --dynamic-linker во время сборки компоновщику с чем-то вроде gcc -Wl,--dynamic-linker,/lib/ld-linux.so.3 foo.c

Однако ничего этого не нужно, если цепочка инструментов настроена правильно, и вам действительно не стоит с ней связываться если у вас действительно нет причин для этого.

Короче говоря, ваше решение, вероятно, является лучшим, однако я постараюсь найти пакет armhf и использовать его, если сможете, или пересобрать пакет.

0
ответ дан 8 January 2013 в 04:06

Другие вопросы по тегам:

Похожие вопросы: