LINUX.ORG.RU

Как создать исполняемый файл, работающий и на 32 , и на 64 бит?

 , ,


0

2

Собственно, вопрос. Как в линукс создать эльф, работающий на 32 битной ОС, и на 64 битной? Реально ли это без перекомпиляции? Т.е. вот как в винде есть Wow64 подсистема, есть ли такое в линуксе? Или надо пересобирать под конкретную систему.

собери для 32 и будет работать и там и там. если на целевой системе есть нужные 32-битные библиотеки.

mos ★★☆☆☆
()

wiki

WoW64 (Windows 32-bit on Windows 64-bit) is a subsystem of the Windows operating system capable of running 32-bit applications on 64-bit Windows.

В самом названии аббревиатура говорит, что WoW64 создан только для того чтоб запускать 32-х битные приложения на 64-x битной оси. О чем дальше прямо говорится:

It aims to create a 32-bit environment ... to run unmodified 32-bit Windows applications on a 64-bit system

Так что ответ на вопрос

Как создать исполняемый файл, работающий и на 32, и на 64 бит?

... и в windows и в linux ответ один - никак.

The SysWOW64 folder located in the Windows folder on the OS drive contains several applications to support 32-bit applications (e.g. cmd.exe, odbcad32.exe, to register ODBC connections for 32-bit applications).

Это тоже самое, что использовать lib32 на x64 дистрибутивах. Ставишь lib32 и можешь запускать 32-х битные исполняемые файлы.

Aber ★★★★★
()
Последнее исправление: Aber (всего исправлений: 1)

Насколько я знаю - нет. Но вот мак/Mach-O поддерживает fat binary.

RazrFalcon ★★★★★
()
Ответ на: комментарий от mos

собери для 32 и будет работать и там и там. если на целевой системе есть нужные 32-битные библиотеки.

А если их нет? Я собирал 32 битное , и на 64 битной виртуалке такой эльф не запускается. Хотя как бы все верно. Нет ли какого-то способа прилинковать заранее эти библиотеки?

Это тоже самое, что использовать lib32 на x64 дистрибутивах. Ставишь lib32 и можешь запускать 32-х битные исполняемые файлы.

в винде wow64 стоит искоробки, не надо думать, есть ли оно у пользователя или нет. Вот думал, можно ли подобное сделать в линукс - чтобы ничего не ставить, а взял и запустил.

Есть вариант использовать скрипт, т.е. какой-то питон или пхп, чтобы качал и запускал что надо, но это костыль все же.

zer0cat
() автор топика
Ответ на: комментарий от zer0cat

Можешь сделать эдакий самопальный self-extract. Идея в следующем. Есть shell-скрипт, в конец скрипта записывается прямо в бинарном виде ELF32, запоминаются смещения начала и конца бинаря, за ним аналогично пишется ELF64, опять же запоминаются смещения. В теле самого скрипта проверяется архитектура, после чего в зависимости от архитектуры скрипт «распаковывает» бинарь из себя самого и запускает.

DELIRIUM ☆☆☆☆☆
()

Исполняемый файл run.sh, который выполнит uname -r, чтобы узнать, для какой разрядности бинарник запускать. Найти можно в многочисленных линуксовых играх, World of Goo, VVVVVV, Super Meat Boy, и так далее

anonymous
()
Ответ на: комментарий от DELIRIUM

Спасибо. Я примерное такое и думал, только не на Shell, а на скриптах. Просто предполагал, может есть другое решение, более изящное.

zer0cat
() автор топика
Ответ на: комментарий от zer0cat

Просто предполагал, может есть другое решение, более изящное.

Есть. Собирать из исходников на целевой платформе юзера и тогда вообще плевать и на разрядность и на архитектуру и на многое другое.

И да велосипедов под gnu/linux для упаковки разного в некий единый файл много но стандартом ничего так и не стало ибо это попоболь только для тех кто намерен распространять свой продукт в бинарниках.

anonymous
()
Ответ на: комментарий от example_cat

Ну, как я понял, ТС хочет именно одним файлом. Два бинаря и запускатор - это очевидно, он бы не спрашивал, если бы его такой вариант устраивал.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

Ну, как я понял, ТС хочет именно одним файлом.

Да, но я понял, что это анриал.

32 битвиые программы не нужны.

а 128 битные?

Есть. Собирать из исходников на целевой платформе юзера и тогда вообще плевать и на разрядность и на архитектуру и на многое другое.

не каждый юзер может собрать. Я вот вроде пишу неск. лет (под другую ОС, но не суть), а psi под дебиан не осилил собрать, так и забил.

zer0cat
() автор топика
Ответ на: комментарий от zer0cat

Ещё тебе информация к размышлению - во всех бинарных дистрах как правило есть пакеты отдельно для х86 и х86_64.

anonymous
()
Ответ на: комментарий от zer0cat

ну а как в андроеде и заднеприводной оси? там пак с несколькими вариантами программы для разных платформ. а запускать можно через win32-запускалку, или для unit shell-скрипт. зачем мучаться с упаковщиками, это отдельное минное поле.

example_cat
()
Ответ на: комментарий от zer0cat

только не на Shell, а на скриптах

...

mos ★★☆☆☆
()
Ответ на: комментарий от ptah_alexs

Гугли FatElf

Гугли «мертвое мертвое»

anonymous
()
#!/bin/sh

# Set the current directory
CANONPATH=`readlink -f "$0"`
cd "`dirname "$CANONPATH"`"

# Look for data directories
if [ ! -e res ] || [ ! -e SE ]
then
	echo "Missing res/ and SE/ directories in `pwd`"
	echo "Your installation is incomplete!"
	exit 1
fi

# Detect CPU architecture
MACHINE=`uname -m`
if [ "$MACHINE" = x86_64 ]
then
	LIBS=./lib64
	BIN=./SyobonAction.x86_64
else
	LIBS=./lib32
	BIN=./SyobonAction.x86
fi

# Run the game
export LD_LIBRARY_PATH=$LIBS:"$LD_LIBRARY_PATH"
$BIN $@

exit $e
ZenitharChampion ★★★★★
()
Последнее исправление: ZenitharChampion (всего исправлений: 2)
Ответ на: комментарий от zer0cat

Слинкуй свою 32-разрядную программу со всеми нужными ей библиотеками статически. Тогда для ее запуска не нужно будет динамических библиотек. Любое 64-разрядное ядро умеет запускать 32-разрядные программы.

iliyap ★★★★★
()

Почему просто не поставлять два исполняемых файла?

grem ★★★★★
()
Ответ на: комментарий от zer0cat

Как ты думаешь зря что ли придумали всякие rpm/deb/etc ?

Jopich1
()
Ответ на: комментарий от iliyap

Почему просто не поставлять два исполняемых файла?

можно и так, да.

Слинкуй свою 32-разрядную программу со всеми нужными ей библиотеками статически

как это сделать?

zer0cat
() автор топика

А если сделать шелл скрипт? Он может прыгать на пейлоад, включённый В НЕГО ЖЕ, по какому-нибудь признаку. Наверное, самый распространённый пример — это run файл нвидиевского драйвера? Вроде даже была какая-то утилита, которая их генерировала.

linuxnewbie
()

открой исходники, и они сами создадутся, если надо будет

why
()

если либу 32 подключить к 64 исполняющимся, только ограничения скорей всего будут

why
()
Ответ на: комментарий от WitcherGeralt

Ну когда я это видел, никаких appimage ещё не было.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от boowai

А как выключить в ядре поддержку 32-разрядных процессов? Какой CONFIG параметр за это отвечает? Я о таком не слышал, мне правда интересно.

iliyap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.