реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Статическая линковка в MinGW, под RTOS-32
Николай КОКОРИН
сообщение Dec 10 2009, 10:50
Сообщение #1





Группа: Участник
Сообщений: 3
Регистрация: 22-03-05
Пользователь №: 3 589



Извините, если запостил не в тот раздел. Только тут упоминание про GNU.
После сборки простейшего проекта в MinGW получаю зависимый от msvcrt.dll исполняемый файл. Подскажите что делать, как избавиться от msvcrt.dll в зависимостях? Операционка RTOS-32 (www.on-time.com) частично совместима по АПИ с виндой, а я пишу динамически загружаемый для неё модуль. С тасканием dll там некоторый гемор, так просто не загрузишь. Получается так, что для того, чтобы загрузить msvcrt.dll необходимо ещё загрузить виндовские kernel32.dll и ntdll.dll - не вариант.

Пример, есть стандартрая си-шная либа libmsvcrt.a (входит в состав MinGW) и я пытаюсь слинковать её статически со своей прогой:
Код
/* hello.c */
#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("hello, world\n");
    return(0);
}

А вот командная строчка для сборки:
Код
gcc.exe hello.c -static -lmsvcrt -o hello

В итоге получается файл hello.exe с зависимостью от msvcrt.dll. Вот список требующихся функций:
Код
__getmainargs
__p__environ
__p__fmode
__set_app_type
_cexit
_fmode
_fpresent
_iob
_onexit
_setmode
atexit
puts
signal

Как на MinGW можно сбилдить прогу без зависимости от msvcrt.dll ? После билда в VS с ключом /MT той же проги msvcrt.dll в зависимостях нет.
Подскажите в какую сторону копать.
ЗЫ: приложил файлики

Сообщение отредактировал Николай КОКОРИН - Dec 10 2009, 10:52
Прикрепленные файлы
Прикрепленный файл  Hello.zip ( 27.86 килобайт ) Кол-во скачиваний: 23
 
Go to the top of the page
 
+Quote Post
klen
сообщение Dec 10 2009, 18:34
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(Николай КОКОРИН @ Dec 10 2009, 13:50) *
Извините, если запостил не в тот раздел. Только тут упоминание про GNU.
После сборки простейшего проекта в MinGW получаю зависимый от msvcrt.dll исполняемый файл. Подскажите что делать, как избавиться от msvcrt.dll в зависимостях? Операционка RTOS-32 (www.on-time.com) частично совместима по АПИ с виндой, а я пишу динамически загружаемый для неё модуль. С тасканием dll там некоторый гемор, так просто не загрузишь. Получается так, что для того, чтобы загрузить msvcrt.dll необходимо ещё загрузить виндовские kernel32.dll и ntdll.dll - не вариант.

Пример, есть стандартрая си-шная либа libmsvcrt.a (входит в состав MinGW) и я пытаюсь слинковать её статически со своей прогой:
Код
/* hello.c */
#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("hello, world\n");
    return(0);
}

А вот командная строчка для сборки:
Код
gcc.exe hello.c -static -lmsvcrt -o hello

В итоге получается файл hello.exe с зависимостью от msvcrt.dll. Вот список требующихся функций:
Код
__getmainargs
__p__environ
__p__fmode
__set_app_type
_cexit
_fmode
_fpresent
_iob
_onexit
_setmode
atexit
puts
signal

Как на MinGW можно сбилдить прогу без зависимости от msvcrt.dll ? После билда в VS с ключом /MT той же проги msvcrt.dll в зависимостях нет.
Подскажите в какую сторону копать.
ЗЫ: приложил файлики


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

я так думаю что тут не MinGW а сама OC дает такую ситуацию. Например мы видим puts - это вытягивается printf'ом . но это работа с "символьным девайсом" и реализована могет быть только в ядре ОС, соответственно без dll'ок никак.

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

чето както так.
Go to the top of the page
 
+Quote Post
Николай КОКОРИН
сообщение Dec 11 2009, 06:07
Сообщение #3





Группа: Участник
Сообщений: 3
Регистрация: 22-03-05
Пользователь №: 3 589



Я выше писал, что на VS получается сбилдить прогу без зависимоти от этой гнусной msvcrt.dll (с ключом /MT). По идее как-то можно это осуществить и на MinGW... Склоняюсь к мнению, что надо где-то раскопать статическую libmsvcrt.a
Go to the top of the page
 
+Quote Post
timm
сообщение Dec 11 2009, 16:38
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 13-03-09
Пользователь №: 46 049



Всё правильно: msvcrt.dll - это, так называемый run-time, она же libc, в числе прочего содержит реализацию printf().
VS имеет статическую версию этой библиотеки.
mingw весь построен вокруг msvcrt.dll, поскольку её использование не подпадает под лицензионные ограничения.
собственной libc у mingw нет.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 11 2009, 16:49
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Николай КОКОРИН @ Dec 11 2009, 09:07) *
Я выше писал, что на VS получается сбилдить прогу без зависимоти от этой гнусной msvcrt.dll (с ключом /MT). По идее как-то можно это осуществить и на MinGW... Склоняюсь к мнению, что надо где-то раскопать статическую libmsvcrt.a
Для борланда и VS есть тулзы implib и impdef. Что касается MinGW, так задайте вопрос на www.mingw.org.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
klen
сообщение Dec 11 2009, 23:38
Сообщение #6


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



попробуйте забить на микросовтовскую.
libc много реализаций. например newlib
залез в исходники увидел что подерживает i386 и x86_64, хотел было радостно предложить но оказалось что это порты платформенозависимых частей ( это crt код и реализация системных вызовов например) реализованы только для платформы linux и кажется wince(не стал смотреть - неинтересно). для cygwin (это бы Вам подошлобы ) только заглушки - плюнули и бросили вроде. для mingw32 вообще намека нет. короче говоря под это говно(ессесено это мое мнение) - win32/64 ребята не сделали порт системных вызовов. Поглядев как это сделано для линукса видно что очень просто доделать для масдая.... только кому это нада?

вобщем вывод такой - взять найти реализацию libc которая собередся для масдая, уверен что их есть smile.gif нада поискать.

глянуд че собирается под cygwin
int main()
{}

бинарник тянет libcygwin1.dll и kernel32.dll - тоесть у цигвина своя libc, прогрес налицо. цигвин есть в исходниках....
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 12 2009, 17:54
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(klen @ Dec 12 2009, 02:38) *
бинарник тянет libcygwin1.dll и kernel32.dll - тоесть у цигвина своя libc, прогрес налицо. цигвин есть в исходниках....


Плюс к тому - если собрать либц от цигвина и примастырить к мингв - сразу починится извечный глюк мингв, связанный с ftell/fseek по текстовым файлам (из-за CR/CRLF), из-за которого есть проблема компиляции асм-исходников, напичканных инклудами и макросами, бинутилсовским as, собранным с мингв. Так что, в общем, я бы не советовал пользоваться мингв вообще, а если пользоваться, знать о таких нюансах. В свое время, когда бинутилсы портировал, столько частей тела себе отбил об этот мингв...
Go to the top of the page
 
+Quote Post
timm
сообщение Dec 14 2009, 11:51
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 13-03-09
Пользователь №: 46 049



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

BTW мингв умеет линковатся с статической библиотекой от VS.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016