Mini-posix knihovna s Win32 API

mhi

  • ***
  • 245
    • Zobrazit profil
Mini-posix knihovna s Win32 API
« kdy: 18. 12. 2020, 15:31:16 »
Mam celou radu ruznych Unixovych C programku, ktere zpracovavaji ruzna data (jedna se o hodne specificke veci). Nepouziva to nic vic nez standardni posixove fce (fopen/fread,open/read, strcmp, malloc, ..). Obvykle je pouzivam v Linuxu, jenze obcas bych potreboval mit aktualni verzi i pro Windows.

Prevest .elf na .exe umim, potreboval bych ale nejakou mini libc POSIX knihovnu, na jejimz druhem konci bude Windows API.Tzn napr. open bude volat CreateFileA(/W). Tedy abych udelal 'ld -r -o file.elf *.o winposix.a' a pak ten ELF jen uz prevedl na EXE (COFF/PE) s importem nutnych fci kernel32/user32. Znate nekdo neco takoveho?

Jasne, je tu mingw ktere pouziva msvcrt, ale tomu se chci vyhnout (tzn toto mi nevyhovuje https://stackoverflow.com/questions/39622501/mingw-installation-on-linux )
« Poslední změna: 18. 12. 2020, 18:17:15 od Petr Krčmář »


Idris

  • *****
  • 1 050
    • Zobrazit profil
    • E-mail
Re:gcc & Win32 mini-posix knihovna
« Odpověď #1 kdy: 18. 12. 2020, 16:21:58 »
Pokud nevyhovuje MinGW, tak snad jen WSL, verze 1 převádí linuxové syscally na Win32 API (není to tedy na úrovni libc, ale funguje to spolehlivě). POSIXový subsystém Windows mívaly, ale to už je dávno.

P.S. Nicméně funkce jako fopen, malloc, strcmp apod. jsou součástí standardní knihovny céčka a Windows je umí, občas s mírnými podivnostmi. Také je vhodné zmínit, že Microsoft teď na Windows nabízí clang (v rámci Visual Studia).
« Poslední změna: 18. 12. 2020, 16:24:52 od Idris »

Re:gcc & Win32 mini-posix knihovna
« Odpověď #2 kdy: 18. 12. 2020, 17:01:12 »
Proč zdrojáky vašich prográmků nezkompilujete třeba ve Visual Studiu? Pokud vám vadí msvcrt a prográmky jsou zejména pro vás, linkuje ji staticky.

POSIXová volání jako open, read či write by měla být podporována, jen tam Microsoft z nějakého důvodu vyžaduje prefix "_", jinak dostanete varování. Ten ale můžete vypnout (případně chybu, pokud je dané volání považováno za příliš deprecated), kterou lze také vypnout.

Přímé převádění ELF do EXE mi přijde dosti zvláštní ve smyslu, že si můžete nepěkně naběhnout na některé věci specifické pro Windows. Např. je dobré dávat programu manifest, jinak vás mohou nepříjemně překvapit věci jako "kompatibilita s Windows XP".

mhi

  • ***
  • 245
    • Zobrazit profil
Re:gcc & Win32 mini-posix knihovna
« Odpověď #3 kdy: 18. 12. 2020, 17:14:40 »
ad Idris: WSL resi bohuzel uplne jiny problem.

ad Martin Drab: Prave o to abych nemusel resit nejake kompatibility a rekompilaci ve VS (v jinem systemu nez primarne probiha vyvoj) nechci pouzivat Visual studio, ani msvc. Manifest je to nejmensi.

Re:gcc & Win32 mini-posix knihovna
« Odpověď #4 kdy: 18. 12. 2020, 17:32:53 »
A prekladat v Dev-C++?


Re:gcc & Win32 mini-posix knihovna
« Odpověď #5 kdy: 18. 12. 2020, 18:03:02 »
Citace
ad Martin Drab: Prave o to abych nemusel resit nejake kompatibility a rekompilaci ve VS (v jinem systemu nez primarne probiha vyvoj) nechci pouzivat Visual studio, ani msvc. Manifest je to nejmensi.
Já bohužel v drtivé většině případů řeším opačný problém -- portování do Linuxu. Což je díky možnosti vzdálené kompilace přes SSH o dost příjemnější, pokud od toho člověk nechce zázraky.

Ale již jsem k pár projektům tvořil MSVS solution a project soubory a obvykle to nebyl ten největší problém. Ten představovalo nalezení všech závislostí a jejich případná kompilace/portace též do MSVS (zlib, libpng). S kódem obvykle potíže moc nebyly, jelikož se veskrze jednalo o knihovny podporující mnoho platforem.

Nevím, zda-li by třeba s MSVS nepomohl GitHub a možnost CI (MSVS je tam podporováno, ale nikdy jsem na vlastním projektu nezkoušel).

Re:Mini-posix knihovna s Win32 API
« Odpověď #6 kdy: 18. 12. 2020, 20:34:06 »
Mingw a cygwin jsou tradiční možnosti. Proč nevyhovují?

Re:Mini-posix knihovna s Win32 API
« Odpověď #7 kdy: 18. 12. 2020, 21:29:27 »
Mam celou radu ruznych Unixovych C programku, ktere zpracovavaji ruzna data (jedna se o hodne specificke veci). Nepouziva to nic vic nez standardni posixove fce (fopen/fread,open/read, strcmp, malloc, ..). Obvykle je pouzivam v Linuxu, jenze obcas bych potreboval mit aktualni verzi i pro Windows.
OpenWatcom by nestačil? Pro běžné věci se chová více než dobře, vlastně pro portování z Linuxu dá nejvíc práce síťová komunikace (inicializace winsock2, send/recv místo write/read) a do exe to vše potřebné přilinkuje.

mhi

  • ***
  • 245
    • Zobrazit profil
Re:Mini-posix knihovna s Win32 API
« Odpověď #8 kdy: 18. 12. 2020, 22:41:16 »
Dekuji vsem za tipy "jak to resit jinak". Vetsinu jsem myslim zvazil a nejsou uplne vyhovujici.

Jedna se o celou radu malych 'projektu', ktere kompiluju historicky na ruznych strojich, dokonce s ruznymi Unixy (primarne to je Linux). Vsude je ale GCC do ELFu. Prikladem takoveho projektiku je disassembler pro nejakou lehce neobvyklou ISA. Bez toho abych musel resit nejake kopirovani zdrojaku, jejich modifikaci pro kompilaci v MSVC/watcom/borland/whatever, bych rad nabuildoval Win32 verzi.

Skutecne bych potreboval jen zdrojak nejake minimalisticke posix/libc navazane na Win32 API. Tedy aby open vypadal nejak tak, ze prehaze parametry a zavola CreateFileA (/W). A pak zkontroluje navratovou hodnotu a opet nastavi spravne errno.

Mozna si nabiham na vidle, protoze to treba neni tak uplne jednoduche, uz jen kvuli tomu ze ve Win myslim neni jasne definovany stdin/out/err ( ... GetStdHandle(STD_xxx_HANDLE)) takze asi i takovato blbost jako preklad tech handles se musi resit.

Koukal jsem do zdrojaku VC++ crt a MS resi mapovani skrze '#define _osfhnd(i)  ( _pioinfo(i)->osfhnd )' ... coz prinasi celou radu problemu s lockovanim...achjo.

Re:Mini-posix knihovna s Win32 API
« Odpověď #9 kdy: 18. 12. 2020, 23:00:01 »
Citace
Mozna si nabiham na vidle, protoze to treba neni tak uplne jednoduche, uz jen kvuli tomu ze ve Win myslim neni jasne definovany stdin/out/err ( ... GetStdHandle(STD_xxx_HANDLE)) takze asi i takovato blbost jako preklad tech handles se musi resit.

Handle (obdoba file deskriptorů) jjsou ukazatele, ne inty a jejich hodnoty se chovají jinak (dolní dva bity jsou snad vždy nulové, nejdou tedy "po sobě" jako file deskriptory). A ano, nejsou žádné pevně definované hodnoty pro standardní vstup, výstup či chybový výstup, proto existuje Get/SetStdHandle. Pojetí toho všeho je tady trochu obecnější. Navíc, Windows nejsou primárně konzolové.

V reálu by hodnoty handle neměly překročit cca 16 MB (ale to je nedokumentovaný fakt závislý na implementaci už minimálně 20 let). CRT pro emulaci POSIXového světa používá právě to mezipole pro mapování "file deskriptorů" na handle.

Je ale pravda, že zrovna pracovat s těmi imitacemi file deskriptorů je poměrně otrava (pokud jsem to potřeboval, obvykle jsem si napsal wrapper, který na Windows používá handle a na Linuxu prostě file deskriptory).

Bohužel tady asi neporadím. Jestli to chápu správně, tak se chcete vyhnout tomu, že byste vzal všechny ty malé zdrojáčky a pokusil se je kompilovat nějak nativně ve Windows, protože se bojíte, že by bylo třeba příliš mnoha změn v tom, co zatím funguje.

mhi

  • ***
  • 245
    • Zobrazit profil
Re:Mini-posix knihovna s Win32 API
« Odpověď #10 kdy: 18. 12. 2020, 23:26:19 »
Bohužel tady asi neporadím. Jestli to chápu správně, tak se chcete vyhnout tomu, že byste vzal všechny ty malé zdrojáčky a pokusil se je kompilovat nějak nativně ve Windows, protože se bojíte, že by bylo třeba příliš mnoha změn v tom, co zatím funguje.

ano, chapete to spravne. Krome  toho je jeste duvod ze kdyz udelam nejake zmeny nechci nasledne byt nucen to dodatecne nekde jeste kompilovat, abych pak zjistil, ze jsem zapomnel ... a mam ruzne verze na Win i Unixu.

s temi filedescriptory je jeste jedna potiz, treba dup2 :). Ale takoveto veci nepouzivam. Mozna je reseni nakonec obslehnout msvcrt.

Re:Mini-posix knihovna s Win32 API
« Odpověď #11 kdy: 19. 12. 2020, 11:56:46 »
Ehm, nechci býti kverulant, ale práve ve Watcomu s targetem na win32/console ten stdin/stderr/stdout funguje "out of the box", dup2 zkusím za chvíli (na tomhle stroji to nemám a nechci mlžit jestli fd 0/1/2 fungují jak mají).
Jediný chyták (zcela v souladu s normou ale, nicméně člověka zvyklého z linuxu to může zaskočit) je, že pokud neřeknete jinak, tak fopen()  není v binary modu a ono to opravdu překládá \n -> \r\n.

Re:Mini-posix knihovna s Win32 API
« Odpověď #12 kdy: 19. 12. 2020, 12:19:38 »
Tak vyzkoušeno, až na ten dup2 to funguje podle očekávání. dup2 taky jen nevrací newfd, ale nulu...
Kód: [Vybrat]
int main(int argc, char *argv[])
{
    int fd, fd2, fd3;

    write(1, "stdout\r\n", 8);
    write(2, "stderr\r\n", 8);
    fd = open("xxx", O_RDWR|O_CREAT, 0600);
    if (-1 == (fd2 = dup(1))) {
        perror("dup: %m");
        return 1;
    }
    write(fd2, "dup\r\n", 5);
    if (-1 == (fd3 = dup2(1, fd))) {
        perror("dup2: %m");
        return 1;
    }
    write(fd3, "dup2\r\n", 6);
    write(fd, "dup2_2\r\n", 8);
    fprintf(stderr, "fd=%i fd2=%i fd3=%i\n", fd, fd2, fd3);
    close(fd);
    close(fd2);
    Sleep(25000);
    return 0;
}
Kód: [Vybrat]
stdout
stderr
dup
dup2_2
fd=3 fd2=4 fd3=0
Na běžné utility je fakt rozdíl jen v #ifdef __NT__ #include "windows.h" #endif
« Poslední změna: 19. 12. 2020, 12:22:20 od J ouda »

mhi

  • ***
  • 245
    • Zobrazit profil
Re:Mini-posix knihovna s Win32 API
« Odpověď #13 kdy: 19. 12. 2020, 12:54:57 »
Ja Vam rozumim, ale dabel je v detailech. Teda kdyby to byl jeden dabel, ale ono to je tisic malych dabliku a uz mne to nebavi opravovat a neustale resit nejake kompatibility. Popravde receno mi bohate uz staci jen zmeny ktere jsou v gcc, treba nedavno jsem stravil asi hodinu opravou cizich zdrojaku, cast diky 'double quote' C++ operatoru, ktery se mi nepodarilo vypnout ani zmenou normy C++ (navic kod byl celkem cisty C, jen to bylo hejno ".cpp" souboru).

Nekdy mrknu do nejakych starsich prekladacu typu Borland nebo Watcom na zdrojaky CRT, treba to pujde pouzit, myslel jsem ze existuje nejake free+opensource reseni.

Je to trochu offtopic, ale jsem donekonecna fascinovan tim jak mohou byt nektere veci slozite, treba kdyz se clovek mrkne do zdrojaku openbsd ci netbsd a srovna to s vecmi z OS/X, nebo Linuxu ... nebo srovna posledne zminovane s Windows :-). Asi uz starnu.
« Poslední změna: 19. 12. 2020, 12:57:31 od mhi »

Re:Mini-posix knihovna s Win32 API
« Odpověď #14 kdy: 19. 12. 2020, 13:08:22 »
Nevím proč je zavržené právě mingw-win64 pod linuxem, protože to je podle mne nejjednodušší cesta. Pracovně vyrábím aplikace, které musí fungovat v linuxu, pod windows a OSX. Právě díky mingw můžu pod linuxem jedním make/cmake vyrobit najednou binárky pro linux i windows. Jediné co mě rozčiluje je OSX, protože na to musím myslet zvlášť.