Страниц: 1 [2]
  Печать  
Автор Тема: как создать exe(exe именно в qnx6.5.0) файл из существующ  (Прочитано 9553 раз)
AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #15 : Мая 22, 2012, 07:18:05 pm »

Давайте дождемся ответа от него самого... Если у него есть еще вопросы по этой теме...
Записан

Артём
Участник
*
Offline Offline

Сообщений: 26


Просмотр профиля
« Ответ #16 : Мая 22, 2012, 10:08:41 pm »

Говоря EXE, я подразумеваю именно исполняемый файл(тип приложение) виндовса, его открываешь hex-редактором и первые два символа "MZ" - это исполняемый файл DOS и в XP он тоже по идее работать должен. Он то виндовсовский, но получаем его в qnx, линковщиком который позволяет это сделать. В 4.25 получали его компоновщикам wasm и линковщиком wlink, теперь хотим перейти на 6.5.0, естественно нужен новый компоновщик(jwasm - уже выбрали) и новый линковщик(пока не выбран).
Вот я и хочу чтобы вы помогли с выбором, или же нету стандартных линкощиков(типа qcc или gcc), которые могут сделать exe файл. Grin Grin(хоть что-то понятно?)

А я так понял, что говоря ехе они имеют ввиду pe/coff формат файла.
не скажу точно, кажется так и есть
« Последнее редактирование: Мая 22, 2012, 10:16:36 pm от Амаяк » Записан
dmi
QOR.Admin
*****
Offline Offline

Сообщений: 470



Просмотр профиля
« Ответ #17 : Мая 22, 2012, 10:27:36 pm »

Не думаю, что в QNX можно собрать именно .exe файл для Windows стандартными средствами.
Может быть имеет смысл решить задачу стандартными средствами, например objcopy?
В hex-формат я перевожу именно им, но сможет ли он отработать по .o файлу - не уверен.
Записан
Артём
Участник
*
Offline Offline

Сообщений: 26


Просмотр профиля
« Ответ #18 : Мая 22, 2012, 11:41:29 pm »

Может быть имеет смысл решить задачу стандартными средствами, например objcopy?
В hex-формат я перевожу именно им, но сможет ли он отработать по .o файлу - не уверен.

можно поподробнее? что эта прога делает?
Записан
dmi
QOR.Admin
*****
Offline Offline

Сообщений: 470



Просмотр профиля
« Ответ #19 : Мая 23, 2012, 12:25:11 am »

примерно то, что вам и нужно сделать - разбор исполняемого файла на секции и перевод из формата в формат
Не знаю насчет выравнивания...

Вот ссылка на man:
http://www.opennet.ru/docs/RUS/binutils/binutils-3.html

Перевод в формат Intel HEX:
Код:
-O ihex
Если цель всей этой цепочки ухищрений - получить выравненный массив данных, может просто выравнять их в коде? Или я что-то не понял из объяснений.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #20 : Мая 23, 2012, 04:09:38 am »

Если нужен досовский MZ, то это не совсем то, что виндоский PE. У виндоского тоже есть MZ стаб где выводиться "эта программа не может быть запущена в дос".
Но не суть важно. Я не знаю для чего вам все это, но возможно objcopy вам поможет. Или же соберите jwlink. Сильных граблей там вроде не должно быть.
Записан
Артём
Участник
*
Offline Offline

Сообщений: 26


Просмотр профиля
« Ответ #21 : Мая 23, 2012, 10:05:58 am »

примерно то, что вам и нужно сделать - разбор исполняемого файла на секции и перевод из формата в формат
умеет ли он указатели в сегментах переопределять? ведь при трансляции в объектник указатели в сегментах имеют значения относительно своего сегмента(это проблема проявляется когда сегментов несколько).

Я не знаю для чего вам все это, но возможно objcopy вам поможет.
exe-шник необходим только из-за того, что в нем адресация 4-х байтная. вот в чем причина, просто при загрузке этого exe мы переопределяем указатели и отбрасываем все стандартные ненужные ее части и остается hex файл со структурами и связанными указателями. Т.е. используем его, как файл данных.


в общем, всем спасибо, буду добивать jwlink, тогда подскажите, как watcom перенести в qnx?
« Последнее редактирование: Мая 23, 2012, 10:31:53 am от Амаяк » Записан
vshemm
Sr. Member
****
Offline Offline

Сообщений: 317


Просмотр профиля
« Ответ #22 : Мая 23, 2012, 11:13:29 pm »

jwasm по умолчанию выдает интеловский OMF, который гнушный линкер не переваривает. Да и если бы переварил, на выходе получился бы executable ELF. Так что тут действительно потребуется кросс-линкер, который поддерживает нужные таргеты, типа pe-i386.

objcopy не поможет - он не умеет обрабатывать секции (вроде как Wink).

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

Например, заставить jwasm делать ELF объектники (relocatable ELF) и обрабатывать непосредственно их. Придется, правда, пройтись по секциям и настроить релокейшены руками, т.е. создать сегменты самим. Зато линкер не нужен.

Если это делать лень, можно скормить подобный ELF гнушному линкеру (не gcc и тем более qcc, а ld), который на его основе и на основе ld-скрипта создаст executable ELF с уже всеми разрешенными релокейшенами (возможно, останутся только dynamic rel для рантайма, например, внешние зависимости, но для вас это не критично). Останется только выкусить тем же objcopy нужный сегмент и превратить в hex тем же hexdump'ом. ldd скрипт с нуля можно не писать - достаточно подредактировать стандартный на предмет как будут группироваться секции, и как и по каким адресам они будут превращаться в сегменты.

В итоге, останется зависимость от пары утилит и гнушного линкера, которые есть практически везде. И от jwasm, который, впрочем, можно будет заменить на любой другой ассемблер, умеющий выдавать ELF. И займет это решение явно меньше месяца.

С другой стороны, jwlink собрать проще, а там уже либо ишак, либо падишах Wink
Записан
Артём
Участник
*
Offline Offline

Сообщений: 26


Просмотр профиля
« Ответ #23 : Мая 24, 2012, 09:16:09 am »


Например, заставить jwasm делать ELF объектники (relocatable ELF) и обрабатывать непосредственно их. Придется, правда, пройтись по секциям и настроить релокейшены руками, т.е. создать сегменты самим. Зато линкер не нужен.

Если это делать лень, можно скормить подобный ELF гнушному линкеру (не gcc и тем более qcc, а ld), который на его основе и на основе ld-скрипта создаст executable ELF с уже всеми разрешенными релокейшенами (возможно, останутся только dynamic rel для рантайма, например, внешние зависимости, но для вас это не критично). Останется только выкусить тем же objcopy нужный сегмент и превратить в hex тем же hexdump'ом. ldd скрипт с нуля можно не писать - достаточно подредактировать стандартный на предмет как будут группироваться секции, и как и по каким адресам они будут превращаться в сегменты.

так не получится, т.к. нам нужны абсолютный значения указателей внутри файла(относительно адреса блока памяти который мы выделяем динамически при загрузке exe), а если сделать как вы предлагаете, мы получаем относительные значения указателей(относительно начала файла) и вообще теряем местоположения указателей в файле(т.е. теряем возможность восстановить их абсолютные значения).
А на счет ELF формата, на крайний случай, можно и подумать.

А почему не подходят qcc и gcc линкеры??Если создать ELF объектник
« Последнее редактирование: Мая 24, 2012, 03:11:09 pm от Амаяк » Записан
vshemm
Sr. Member
****
Offline Offline

Сообщений: 317


Просмотр профиля
« Ответ #24 : Мая 24, 2012, 05:20:38 pm »

Нет, получатся как раз абсолютные адреса (относительно блока памяти, который указан в ld-скрипте). Правда, адрес загрузки уже изменить не удастся, т.к. информация о релоках потеряется. Однако, есть еще shared ELF - аналог dll - где эта информация остается Smiley

На самом деле gcc скрыто использует гнушный линкер, просто вызывает его со своими параметрами. Ну а qcc - это просто обертка вокруг gcc. Вызов ld напрямую нужен для указания некоторых опций, в частности, ld-скрипта.
Записан
Артём
Участник
*
Offline Offline

Сообщений: 26


Просмотр профиля
« Ответ #25 : Мая 24, 2012, 10:23:03 pm »

 SmileyСпасибо за разъяснение
Записан
Страниц: 1 [2]
  Печать  
 
Перейти в: