121
Разработки Kirov OSUG / Re: Программа для преобразования исполняемого файла Linux для запуска в OpenSolaris
« : Март 13, 2011, 10:28:54 pm »Существуют такие приложения, как например skype и некоторые фильтры печати, у которых закрыты исходники, но свободно доступны бинарники под Linux. Хотелось бы иметь программу которая преобразовывала бы эти приложения так, чтобы они могли запускаться под OpenSolaris без необходимости использования зоны или lxrun. Узнав, что формат исполняемых файлов под обеими ОС одинаковый, решил попробовать поисследовать возможность создания такой программы.А чем кросскомпиляторы не устраивают? Типа MinGW? Можно компилировать сразу под три платформы:
Взял самый простой пример приложения на С:
#include <stdio.h>
int main(){
printf("HW!\n");
return 0;
}
Команда gcc -O3 -S генерирует одинаковый ассемблерный код как в случае Linux (в lx-зоне), так и в случае OpenSolaris.
Сгенерированный в lx-зоне объектный файл, поданный на вход gcc в OpenSolaris, позволил без ошибок слинковать нормально работающее приложение. Таким образом, если приложение использует только libc(не исключаю, что допустимо использование и других библиотек), то если из бинарника удастся сформировать объектный файл, на основе которого он создан, то можно получить такое же приложение под OpenSolaris.
Дизассемблировать линуксовое приложение, а потом снова сассемблировать под OpenSolaris - затруднительно в виду сложности создания адекватного дизассемблера.
Зависимости приложения под Linux:
$ldd a.out
libc.so.6 => /lib/tls/libc.so.6 (0xfe776000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xfef61000)
$objdump -R a.out
a.out: file format elf32-i386
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
08049534 R_386_GLOB_DAT __gmon_start__
0804952c R_386_JUMP_SLOT puts
08049530 R_386_JUMP_SLOT __libc_start_main
Под OpenSolaris зависимости совершенно другие. Для упрощения задачи взял еще более простой пример программы.
// Компиляция: as -o hello.o hello.s && ld -s hello.o -lc && ./a.out
.text
.globl _start
_start:
pushl $message1
call puts
popl %ebx
call exit
hlt
.data
message1:
.string "Hello world\0"
Теперь зависимости от функций совпадают.
$objdump -R a.out
a.out: file format elf32-i386
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
08049330 R_386_JUMP_SLOT exit
08049334 R_386_JUMP_SLOT puts
Открыл файл a.out с lx-зоны в ghex2 и внес изменения:
1. Строку /usr/lib/libc.so.1 заменил на /usr/lib/ld.so.1
2. Строку libc.so.6 заменил на libc.so.1
3. Строку GLIBC_2.0 заменил на SUNW_0.8, находящуюся чуть ниже последовательность байт 10 69 69 0D, тоже задающую версию, заменил на 98 28 3d 0a
Просмотр доступных версий в libc: objdump -p /lib/libc.so.1. objdump -p a.out - просмотр используемой приложением версии.
Файл запускается и работает нормально. Это доказывает возможность с относительно небольшими изменениями модифицировать бинарники из Linux для нативного запуска под OpenSolaris.
- OpenSolaris
- GNU/Linux
- Windows