1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.215
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    1. куча вариантов, как это можно узнать не имея исходников - сигнатурный анализ, анализ по содержимому, исследование кода работы с файлом.
    2. В каждом случае всё индивидуально. Но чаще всего всё уже есть, просто надо хорошо поискать.
     
  4. Ardash

    Ardash

    Регистрация:
    5 окт 2017
    Сообщения:
    1.019
    Зачастую приходится работать с исполняемыми файлами при отсутствии исходного кода игры/программы.
    Первое, что стоит изучить, это язык ассемблера и как он транслируется в машинный код (например, для процессоров семейства x86 coder32 edition | X86 Opcode and Instruction Reference 1.12).
    Имея примерное понимание, как из машинного кода получить код на языке ассемблера, можно приступать к изучению инструментов, помогающих делать это в автоматическом режиме, т.н. дизассемблеров.
    Начиная с этого момента, у вас на руках появляется некий набор команд, изучая который можно прийти к выводу как работает программа.
    Ну а дальше надо искать код, отвечающий за обработку ресурсов и изучать уже конкретно его.

    Из книг вполне подойдет любая книга по ассемблеру в целом.
    Затем по ассемблеру конкретных семейств процессоров.
    Почитайте статьи по работе с дизассемблерами.

    Но вообще, как по мне, лучше начинать этот путь с попытки писать программы на ассемблере, например во всякие микроконтроллеры
     
  5. c4_d

    c4_d

    Регистрация:
    11 авг 2009
    Сообщения:
    41
    Спасибо за полный ответ. Направление теперь мне хотя бы понятно.
    --- добавлено 14 янв 2019, предыдущее сообщение размещено: 14 янв 2019 ---
    Как то расплывчато но тоже спасибо. Ассемблер и внимательность, ну или как то так
     
  6. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Совет отдаёт вредительством, учитывая, что человеку необходимо разбирать код для x86/DOS.
     
    nop и Bato-San нравится это.
  7. c4_d

    c4_d

    Регистрация:
    11 авг 2009
    Сообщения:
    41
    Я писал под микроконтроллеры. Но только на С (и то немного и то по даташиту, но получилось хорошо). И не вижу какой либо проблемы. проблема в том, что я практически не могу читать код ассемблера. Поэтому я спросил с чего бы начать. Тут надо как бы спуститься с абстракций на железную землю. И вредительства я не вижу. программирование под МК - довольно денежная профессия. Даже если ничего с изъятием ресурсов не получится, буду читать ассемблер. Для моей работы сейчас (я пишу на python сейчас до того писал на шарпах, до того писал на PHP) очень актуален реверс старых программ - ради спасения данных (документации к сожалению для этих программ нет, и они достаточно сложны, и я решил тренироваться на старых играх чтобы хотя бы понимать как всё устроено, типа от простого к сложному).
     
    Последнее редактирование: 14 янв 2019
  8. Ardash

    Ardash

    Регистрация:
    5 окт 2017
    Сообщения:
    1.019
    Когда целью является изучить язык и научиться читать на нем, абсолютно неважно под какую архитектуру писать, ассемблер везде похожий.
    Написание софта в микроконтроллеры, как мне кажется, единственный сегодня вариант использования асма в простых и реально применимых задачах.
    Не линуксовые же ядра новичку пилить.
     
  9. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    В контексте данного вопроса вредительство, конечно же.
    Поясню: микроконтроллеры — это обычно ARM. Ассемблер у них свой, с очень специфическими нюансами (в силу отличий архитектуры). Далее, DOS — тоже не абстрактная x86-машина, там есть прерывания, системные вызовы, сегментация памяти, и т.д. и т.д. Лучше сразу изучать то, что поможет в деле.
     
    Bato-San нравится это.
  10. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    :facepalm: Слов нет.

    ЗЫ. хотя есть предположение - ты ассемблер с С путаешь.
     
  11. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    @Bato-San, ага, одни слоты задержки в MIPS чего стоят.
     
    Bato-San нравится это.
  12. c4_d

    c4_d

    Регистрация:
    11 авг 2009
    Сообщения:
    41
    С этим я согласен. НО. Поскольку я пишу код скажем так, не загоняясь на железо, то мне пойдет какой либо ассемблер для решения каких нибудь простых задач, типа реализации кольцевого буфера или там сортировок.
    Я считаю, что для написания простых программ - пойдет любая архитектура хоть PIC хость ARM хоть ATMEGA хоть ST хоть MSC. Для реверса/сложных программ под DOS конечно надо читать книги о DOS.
    Мне надо научиться сначала думать, как я понимаю, низкоуровнево (в смысле менее абстрактно относительно кода), чтобы писать на ассемблере, и читать ассемблер код соотвественно.
    Но, конечно, лучше сразу использовать tasm masm и ещё какой асм для х86 архитектуры. Кстати, насколько я понимаю диалекты ассемблера для 86 тоже разные, т.е. могут отличаться. Так что, думаю, изучение "что такое ассемблер" вместо "учим masm" будет гораздо продуктивнее. Ведь всякие сдвиги, mov xor jp jmp просто как я понимаю называются синтаксически по разному, хотя делают они одно и тоже.
     
  13. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Для x86 есть ровно два диалекта — AT&T (ассемблер GNU) и Intel (все остальные — TASM, MASM, FASM, NASM… etc). Кроме синтаксиса, не отличаются ничем. Используется в 99% случаев последний.
     
    Последнее редактирование: 14 янв 2019
    c4_d нравится это.
  14. radzh

    radzh

    Регистрация:
    16 апр 2006
    Сообщения:
    988
    @c4_d, возьми уже Пильщикова, большинство вопросов отпадёт довольно быстро.
     
    c4_d нравится это.
  15. c4_d

    c4_d

    Регистрация:
    11 авг 2009
    Сообщения:
    41
    Тогда, последний вопрос: NASM или TASM? какой посоветуете (у меня старая машина работает на freeDos)? Вопрос снят ввиду комментария ответ который я написал ниже. Спасибо за то, что возились со мной.
    --- добавлено 14 янв 2019, предыдущее сообщение размещено: 14 янв 2019 ---
    Спасибо!
     
  16. Ardash

    Ardash

    Регистрация:
    5 окт 2017
    Сообщения:
    1.019
    Нет не путаю. jump'ы, mov'ы - они везде одинаковые.
     
    Последнее редактирование: 14 янв 2019
  17. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Ага, конечно.
     
    Bato-San нравится это.
  18. Grue13 вице-дегенералиссимус

    Grue13

    Регистрация:
    26 апр 2006
    Сообщения:
    10.095
    А-Т-Г-Ц в ДНК тоже у всех животных и растений одинаковы. ;)
     
    c4_d и Bato-San нравится это.
  19. bckpkol

    bckpkol

    Регистрация:
    18 мар 2011
    Сообщения:
    214
    Патч на Lua, для Win95.
    Собирать с make mingw.
    Код:
    diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/dummydllmain.c" ./dummydllmain.c
    --- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/dummydllmain.c"    1970-01-01 07:00:00.000000000 +0700
    +++ ./dummydllmain.c    2019-01-20 00:00:37.648873465 +0700
    @@ -0,0 +1,19 @@
    +#define WIN32_LEAN_AND_MEAN
    +#include "windows.h"
    +#include "string.h"
    +#include "stdio.h"
    +
    +extern void _pei386_runtime_relocator (void);
    +
    +extern void __pei386_runtime_relocator (void) {
    +    _pei386_runtime_relocator();
    +}
    +
    +BOOL WINAPI _DllMain(
    +   HINSTANCE hinstDLL,
    +   DWORD     fdwReason,
    +   LPVOID    lpvReserved
    +) {
    +    return TRUE;
    +}
    +
    diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/dummyprogmain.c" ./dummyprogmain.c
    --- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/dummyprogmain.c"    1970-01-01 07:00:00.000000000 +0700
    +++ ./dummyprogmain.c    2019-01-19 23:58:43.595002900 +0700
    @@ -0,0 +1,274 @@
    +#define WIN32_LEAN_AND_MEAN
    +#include "windows.h"
    +#include "string.h"
    +#include "stdio.h"
    +
    +extern void _pei386_runtime_relocator (void);
    +
    +extern void __pei386_runtime_relocator (void) {
    +    _pei386_runtime_relocator();
    +}
    +
    +/*
    + *                 Shell basics
    + *
    + * Copyright 1998 Marcus Meissner
    + * Copyright 1998 Juergen Schmied (jsch)  *  <juergen.schmied@metronet.de>
    + *
    + * This library is free software; you can redistribute it and/or
    + * modify it under the terms of the GNU Lesser General Public
    + * License as published by the Free Software Foundation; either
    + * version 2.1 of the License, or (at your option) any later version.
    + *
    + * This library is distributed in the hope that it will be useful,
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    + * Lesser General Public License for more details.
    + *
    + * You should have received a copy of the GNU Lesser General Public
    + * License along with this library; if not, write to the Free Software
    + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
    + */
    +
    +char** WINAPI CommandLineToArgv(char* lpCmdline, int* numargs)
    +{
    +    DWORD argc;
    +    char** argv;
    +    char* s;
    +    char* d;
    +    char* cmdline;
    +    int qcount,bcount;
    +
    +    if(!numargs)
    +    {
    +        SetLastError(ERROR_INVALID_PARAMETER);
    +        return NULL;
    +    }
    +
    +    if (*lpCmdline==0)
    +    {
    +        /* Return the path to the executable */
    +        DWORD len, deslen=MAX_PATH, size;
    +
    +        size = sizeof(char*)*2 + deslen*sizeof(char);
    +        for (;;)
    +        {
    +            if (!(argv = LocalAlloc(LMEM_FIXED, size))) return NULL;
    +            len = GetModuleFileName(0, (char*)(argv+2), deslen);
    +            if (!len)
    +            {
    +                LocalFree(argv);
    +                return NULL;
    +            }
    +            if (len < deslen) break;
    +            deslen*=2;
    +            size = sizeof(char*)*2 + deslen*sizeof(char);
    +            LocalFree( argv );
    +        }
    +        argv[0]=(char*)(argv+2);
    +        argv[1]=NULL;
    +        *numargs=1;
    +
    +        return argv;
    +    }
    +
    +    /* --- First count the arguments */
    +    argc=1;
    +    s=lpCmdline;
    +    /* The first argument, the executable path, follows special rules */
    +    if (*s=='"')
    +    {
    +        /* The executable path ends at the next quote, no matter what */
    +        s++;
    +        while (*s)
    +            if (*s++=='"')
    +                break;
    +    }
    +    else
    +    {
    +        /* The executable path ends at the next space, no matter what */
    +        while (*s && *s!=' ' && *s!='\t')
    +            s++;
    +    }
    +    /* skip to the first argument, if any */
    +    while (*s==' ' || *s=='\t')
    +        s++;
    +    if (*s)
    +        argc++;
    +
    +    /* Analyze the remaining arguments */
    +    qcount=bcount=0;
    +    while (*s)
    +    {
    +        if ((*s==' ' || *s=='\t') && qcount==0)
    +        {
    +            /* skip to the next argument and count it if any */
    +            while (*s==' ' || *s=='\t')
    +                s++;
    +            if (*s)
    +                argc++;
    +            bcount=0;
    +        }
    +        else if (*s=='\\')
    +        {
    +            /* '\', count them */
    +            bcount++;
    +            s++;
    +        }
    +        else if (*s=='"')
    +        {
    +            /* '"' */
    +            if ((bcount & 1)==0)
    +                qcount++; /* unescaped '"' */
    +            s++;
    +            bcount=0;
    +            /* consecutive quotes, see comment in copying code below */
    +            while (*s=='"')
    +            {
    +                qcount++;
    +                s++;
    +            }
    +            qcount=qcount % 3;
    +            if (qcount==2)
    +                qcount=0;
    +        }
    +        else
    +        {
    +            /* a regular character */
    +            bcount=0;
    +            s++;
    +        }
    +    }
    +    /* Allocate in a single lump, the string array, and the strings that go
    +     * with it. This way the caller can make a single LocalFree() call to free
    +     * both, as per MSDN.
    +     */
    +    argv=LocalAlloc(LMEM_FIXED, (argc+1)*sizeof(char*)+(strlen(lpCmdline)+1)*sizeof(char));
    +    if (!argv)
    +        return NULL;
    +    cmdline=(char*)(argv+argc+1);
    +    strcpy(cmdline, lpCmdline);
    +
    +    /* --- Then split and copy the arguments */
    +    argv[0]=d=cmdline;
    +    argc=1;
    +    /* The first argument, the executable path, follows special rules */
    +    if (*d=='"')
    +    {
    +        /* The executable path ends at the next quote, no matter what */
    +        s=d+1;
    +        while (*s)
    +        {
    +            if (*s=='"')
    +            {
    +                s++;
    +                break;
    +            }
    +            *d++=*s++;
    +        }
    +    }
    +    else
    +    {
    +        /* The executable path ends at the next space, no matter what */
    +        while (*d && *d!=' ' && *d!='\t')
    +            d++;
    +        s=d;
    +        if (*s)
    +            s++;
    +    }
    +    /* close the executable path */
    +    *d++=0;
    +    /* skip to the first argument and initialize it if any */
    +    while (*s==' ' || *s=='\t')
    +        s++;
    +    if (!*s)
    +    {
    +        /* There are no parameters so we are all done */
    +        argv[argc]=NULL;
    +        *numargs=argc;
    +        return argv;
    +    }
    +
    +    /* Split and copy the remaining arguments */
    +    argv[argc++]=d;
    +    qcount=bcount=0;
    +    while (*s)
    +    {
    +        if ((*s==' ' || *s=='\t') && qcount==0)
    +        {
    +            /* close the argument */
    +            *d++=0;
    +            bcount=0;
    +
    +            /* skip to the next one and initialize it if any */
    +            do {
    +                s++;
    +            } while (*s==' ' || *s=='\t');
    +            if (*s)
    +                argv[argc++]=d;
    +        }
    +        else if (*s=='\\')
    +        {
    +            *d++=*s++;
    +            bcount++;
    +        }
    +        else if (*s=='"')
    +        {
    +            if ((bcount & 1)==0)
    +            {
    +                /* Preceded by an even number of '\', this is half that
    +                 * number of '\', plus a quote which we erase.
    +                 */
    +                d-=bcount/2;
    +                qcount++;
    +            }
    +            else
    +            {
    +                /* Preceded by an odd number of '\', this is half that
    +                 * number of '\' followed by a '"'
    +                 */
    +                d=d-bcount/2-1;
    +                *d++='"';
    +            }
    +            s++;
    +            bcount=0;
    +            /* Now count the number of consecutive quotes. Note that qcount
    +             * already takes into account the opening quote if any, as well as
    +             * the quote that lead us here.
    +             */
    +            while (*s=='"')
    +            {
    +                if (++qcount==3)
    +                {
    +                    *d++='"';
    +                    qcount=0;
    +                }
    +                s++;
    +            }
    +            if (qcount==2)
    +                qcount=0;
    +        }
    +        else
    +        {
    +            /* a regular character */
    +            *d++=*s++;
    +            bcount=0;
    +        }
    +    }
    +    *d='\0';
    +    argv[argc]=NULL;
    +    *numargs=argc;
    +
    +    return argv;
    +}
    +
    +int real_main(int argc, char* argv[]);
    +
    +int WINAPI _WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    +    int argc;
    +    char** argv=CommandLineToArgv(GetCommandLine(),&argc);
    +    if(argv==NULL) return -1;
    +    int ret=real_main(argc, argv);
    +    LocalFree(argv);
    +    return ret;
    +}
    diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/lua.c" ./lua.c
    --- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/lua.c"    2007-12-28 21:32:23.000000000 +0600
    +++ ./lua.c    2019-01-20 00:08:30.880574451 +0700
    @@ -374,7 +374,7 @@
     }
    
    
    -int main (int argc, char **argv) {
    +int real_main (int argc, char **argv) {
       int status;
       struct Smain s;
       lua_State *L = lua_open();  /* create state */
    diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/luac.c" ./luac.c
    --- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/luac.c"    2006-06-03 00:37:11.000000000 +0700
    +++ ./luac.c    2019-01-20 00:08:41.068739525 +0700
    @@ -183,7 +183,7 @@
      return 0;
     }
    
    -int main(int argc, char* argv[])
    +int real_main(int argc, char* argv[])
     {
      lua_State* L;
      struct Smain s;
    diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/Makefile" ./Makefile
    --- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/Makefile"    2012-02-14 03:41:22.000000000 +0700
    +++ ./Makefile    2019-01-20 00:07:51.123930086 +0700
    @@ -1,18 +1,19 @@
    -# makefile for building Lua
    -# see ../INSTALL for installation instructions
    -# see ../Makefile and luaconf.h for further customization
    +# makefile for building Lua see ../INSTALL for installation instructions see ../Makefile and luaconf.h for further customization
    
     # == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================
    
     # Your platform. See PLATS for possible values.
    +CROSS=i686-w64-mingw32.static
     PLAT= none
    
    -CC= gcc
    -CFLAGS= -O2 -Wall $(MYCFLAGS)
    -AR= ar rcu
    -RANLIB= ranlib
    +CC=$(CROSS)-clang
    +LINKER=$(CROSS)-gcc
    +AR=$(CROSS)-ar rcu
    +RANLIB=$(CROSS)-ranlib
    +PKG_CONFIG=$(CROSS)-pkg-config
    +CFLAGS= -O3 -m32 -march=i486 -mfpmath=387 -m80387 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 -Wall
     RM= rm -f
    -LIBS= -lm $(MYLIBS)
    +LIBS=-Wl,-nostdlib -nostdlib -lmingw32 -lmsvcrt -lkernel32 -lgcc $(MYLIBS)
    
     MYCFLAGS=
     MYLDFLAGS=
    @@ -27,38 +28,58 @@
        lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o  \
        lundump.o lvm.o lzio.o
     LIB_O=    lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \
    -    lstrlib.o loadlib.o linit.o
    +    lstrlib.o loadlib.o linit.o dummydllmain.o
    
     LUA_T=    lua
    -LUA_O=    lua.o
    +LUA_O=    lua.o dummyprogmain.o
    
     LUAC_T=    luac
    -LUAC_O=    luac.o print.o
    +LUAC_O=    luac.o print.o dummyprogmain.o
    
     ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
     ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
     ALL_A= $(LUA_A)
    
    +
    +%.ll: %.c
    +    $(CC) $(CFLAGS) -S -emit-llvm -c -o $@ $<
    +
    +loslib.ll: loslib.c
    +    $(CC) $(CFLAGS) -S -emit-llvm -c -o $<.ll $<
    +    sed s/_difftime32/difftime/g $<.ll>$@
    +
    +lobject.ll: lobject.c
    +    $(CC) $(CFLAGS) -S -emit-llvm -c -o $<.ll $<
    +    sed s/__strtod/strtod/g $<.ll>$@
    +
     default: $(PLAT)
    
     all:    $(ALL_T)
    
    -o:    $(ALL_O)
    +o:    $(ALL_O:.o=.ll)
    
     a:    $(ALL_A)
    
    -$(LUA_A): $(CORE_O) $(LIB_O)
    -    $(AR) $@ $(CORE_O) $(LIB_O)    # DLL needs all object files
    -    $(RANLIB) $@
    -
    -$(LUA_T): $(LUA_O) $(LUA_A)
    -    $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)
    -
    -$(LUAC_T): $(LUAC_O) $(LUA_A)
    -    $(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)
    +llb.ll: $(CORE_O:.o=.ll) $(LIB_O:.o=.ll)
    +    llvm-link -o $@ $(CORE_O:.o=.ll) $(LIB_O:.o=.ll)
    +$(LUA_A): llb.ll
    +    llc -filetype obj -O3 -march=x86 -mcpu=i486 -mattr=+x87 -o llb.ll.o llb.ll
    +    $(LINKER) -shared -o $@ $<.o $(LIBS) --entry __DllMain@12
    +
    +lmf.ll: $(LUA_O:.o=.ll)
    +    llvm-link -o $@ $(LUA_O:.o=.ll)
    +$(LUA_T): lmf.ll $(LUA_A)
    +    llc -filetype obj -O3 -march=x86 -mcpu=i486 -mattr=+x87 -o $<.o $<
    +    $(LINKER) -o $@ $<.o $(LUA_A) $(LIBS) --entry __WinMain@16
    +
    +lcmf.ll: $(LUAC_O:.o=.ll)
    +    llvm-link -o $@ $(LUAC_O:.o=.ll)
    +$(LUAC_T): lcmf.ll $(LUA_A)
    +    llc -filetype obj -O3 -march=x86 -mcpu=i486 -mattr=+x87 -o $<.o $<
    +    $(LINKER) -o $@ $<.o $(LUA_A) $(LIBS) --entry __WinMain@16
    
     clean:
    -    $(RM) $(ALL_T) $(ALL_O)
    +    $(RM) $(ALL_T) $(ALL_O) *.o *.ll lua51.dll lua.exe luac.exe
    
     depend:
        @$(CC) $(CFLAGS) -MM l*.c print.c
    @@ -105,9 +126,8 @@
    
     mingw:
        $(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \
    -    "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
    -    "MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe
    -    $(MAKE) "LUAC_T=luac.exe" luac.exe
    +    "MYCFLAGS=-DLUA_ANSI" lua.exe
    +    $(MAKE) "LUA_A=lua51.dll" "LUAC_T=luac.exe" "MYCFLAGS=-DLUA_ANSI" luac.exe
    
     posix:
        $(MAKE) all MYCFLAGS=-DLUA_USE_POSIX
    @@ -120,63 +140,63 @@
    
     # DO NOT DELETE
    
    -lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \
    +lapi.ll: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \
       lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h \
       lundump.h lvm.h
    -lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h
    -lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h
    -lcode.o: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
    +lauxlib.ll: lauxlib.c lua.h luaconf.h lauxlib.h
    +lbaselib.ll: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h
    +lcode.ll: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
       lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h \
       ltable.h
    -ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h
    -ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \
    +ldblib.ll: ldblib.c lua.h luaconf.h lauxlib.h lualib.h
    +ldebug.ll: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \
       llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
       lfunc.h lstring.h lgc.h ltable.h lvm.h
    -ldo.o: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
    +ldo.ll: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
       lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h \
       ltable.h lundump.h lvm.h
    -ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \
    +ldump.ll: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \
       lzio.h lmem.h lundump.h
    -lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \
    +lfunc.ll: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \
       lstate.h ltm.h lzio.h
    -lgc.o: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
    +lgc.ll: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
       lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h
    -linit.o: linit.c lua.h luaconf.h lualib.h lauxlib.h
    -liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h
    -llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \
    +linit.ll: linit.c lua.h luaconf.h lualib.h lauxlib.h
    +liolib.ll: liolib.c lua.h luaconf.h lauxlib.h lualib.h
    +llex.ll: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \
       lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h
    -lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h
    -lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
    +lmathlib.ll: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h
    +lmem.ll: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
       ltm.h lzio.h lmem.h ldo.h
    -loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h
    -lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \
    +loadlib.ll: loadlib.c lua.h luaconf.h lauxlib.h lualib.h
    +lobject.ll: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \
       ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h
    -lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h
    -loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h
    -lparser.o: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
    +lopcodes.ll: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h
    +loslib.ll: loslib.c lua.h luaconf.h lauxlib.h lualib.h
    +lparser.ll: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
       lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
       lfunc.h lstring.h lgc.h ltable.h
    -lstate.o: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
    +lstate.ll: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
       ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h
    -lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \
    +lstring.ll: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \
       ltm.h lzio.h lstring.h lgc.h
    -lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h
    -ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
    +lstrlib.ll: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h
    +ltable.ll: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
       ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h
    -ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h
    -ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \
    +ltablib.ll: ltablib.c lua.h luaconf.h lauxlib.h lualib.h
    +ltm.ll: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \
       lmem.h lstring.h lgc.h ltable.h
    -lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h
    -luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \
    +lua.ll: lua.c lua.h luaconf.h lauxlib.h lualib.h
    +luac.ll: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \
       lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h \
       lundump.h
    -lundump.o: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h \
    +lundump.ll: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h \
       llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h
    -lvm.o: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
    +lvm.ll: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
       lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h ltable.h lvm.h
    -lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \
    +lzio.ll: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \
       lzio.h
    -print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \
    +print.ll: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \
       ltm.h lzio.h lmem.h lopcodes.h lundump.h
    
     # (end of Makefile)
    diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/patch" ./patch
    --- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/patch"    1970-01-01 07:00:00.000000000 +0700
    +++ ./patch    2019-01-20 00:10:14.930259345 +0700
    @@ -0,0 +1,537 @@
    +diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/dummydllmain.c" ./dummydllmain.c
    +--- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/dummydllmain.c"    1970-01-01 07:00:00.000000000 +0700
    ++++ ./dummydllmain.c    2019-01-20 00:00:37.648873465 +0700
    +@@ -0,0 +1,19 @@
    ++#define WIN32_LEAN_AND_MEAN
    ++#include "windows.h"
    ++#include "string.h"
    ++#include "stdio.h"
    ++
    ++extern void _pei386_runtime_relocator (void);
    ++
    ++extern void __pei386_runtime_relocator (void) {
    ++    _pei386_runtime_relocator();
    ++}
    ++
    ++BOOL WINAPI _DllMain(
    ++   HINSTANCE hinstDLL,
    ++   DWORD     fdwReason,
    ++   LPVOID    lpvReserved
    ++) {
    ++    return TRUE;
    ++}
    ++
    +diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/dummyprogmain.c" ./dummyprogmain.c
    +--- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/dummyprogmain.c"    1970-01-01 07:00:00.000000000 +0700
    ++++ ./dummyprogmain.c    2019-01-19 23:58:43.595002900 +0700
    +@@ -0,0 +1,274 @@
    ++#define WIN32_LEAN_AND_MEAN
    ++#include "windows.h"
    ++#include "string.h"
    ++#include "stdio.h"
    ++
    ++extern void _pei386_runtime_relocator (void);
    ++
    ++extern void __pei386_runtime_relocator (void) {
    ++    _pei386_runtime_relocator();
    ++}
    ++
    ++/*
    ++ *                 Shell basics
    ++ *
    ++ * Copyright 1998 Marcus Meissner
    ++ * Copyright 1998 Juergen Schmied (jsch)  *  <juergen.schmied@metronet.de>
    ++ *
    ++ * This library is free software; you can redistribute it and/or
    ++ * modify it under the terms of the GNU Lesser General Public
    ++ * License as published by the Free Software Foundation; either
    ++ * version 2.1 of the License, or (at your option) any later version.
    ++ *
    ++ * This library is distributed in the hope that it will be useful,
    ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
    ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    ++ * Lesser General Public License for more details.
    ++ *
    ++ * You should have received a copy of the GNU Lesser General Public
    ++ * License along with this library; if not, write to the Free Software
    ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
    ++ */
    ++
    ++char** WINAPI CommandLineToArgv(char* lpCmdline, int* numargs)
    ++{
    ++    DWORD argc;
    ++    char** argv;
    ++    char* s;
    ++    char* d;
    ++    char* cmdline;
    ++    int qcount,bcount;
    ++
    ++    if(!numargs)
    ++    {
    ++        SetLastError(ERROR_INVALID_PARAMETER);
    ++        return NULL;
    ++    }
    ++
    ++    if (*lpCmdline==0)
    ++    {
    ++        /* Return the path to the executable */
    ++        DWORD len, deslen=MAX_PATH, size;
    ++
    ++        size = sizeof(char*)*2 + deslen*sizeof(char);
    ++        for (;;)
    ++        {
    ++            if (!(argv = LocalAlloc(LMEM_FIXED, size))) return NULL;
    ++            len = GetModuleFileName(0, (char*)(argv+2), deslen);
    ++            if (!len)
    ++            {
    ++                LocalFree(argv);
    ++                return NULL;
    ++            }
    ++            if (len < deslen) break;
    ++            deslen*=2;
    ++            size = sizeof(char*)*2 + deslen*sizeof(char);
    ++            LocalFree( argv );
    ++        }
    ++        argv[0]=(char*)(argv+2);
    ++        argv[1]=NULL;
    ++        *numargs=1;
    ++
    ++        return argv;
    ++    }
    ++
    ++    /* --- First count the arguments */
    ++    argc=1;
    ++    s=lpCmdline;
    ++    /* The first argument, the executable path, follows special rules */
    ++    if (*s=='"')
    ++    {
    ++        /* The executable path ends at the next quote, no matter what */
    ++        s++;
    ++        while (*s)
    ++            if (*s++=='"')
    ++                break;
    ++    }
    ++    else
    ++    {
    ++        /* The executable path ends at the next space, no matter what */
    ++        while (*s && *s!=' ' && *s!='\t')
    ++            s++;
    ++    }
    ++    /* skip to the first argument, if any */
    ++    while (*s==' ' || *s=='\t')
    ++        s++;
    ++    if (*s)
    ++        argc++;
    ++
    ++    /* Analyze the remaining arguments */
    ++    qcount=bcount=0;
    ++    while (*s)
    ++    {
    ++        if ((*s==' ' || *s=='\t') && qcount==0)
    ++        {
    ++            /* skip to the next argument and count it if any */
    ++            while (*s==' ' || *s=='\t')
    ++                s++;
    ++            if (*s)
    ++                argc++;
    ++            bcount=0;
    ++        }
    ++        else if (*s=='\\')
    ++        {
    ++            /* '\', count them */
    ++            bcount++;
    ++            s++;
    ++        }
    ++        else if (*s=='"')
    ++        {
    ++            /* '"' */
    ++            if ((bcount & 1)==0)
    ++                qcount++; /* unescaped '"' */
    ++            s++;
    ++            bcount=0;
    ++            /* consecutive quotes, see comment in copying code below */
    ++            while (*s=='"')
    ++            {
    ++                qcount++;
    ++                s++;
    ++            }
    ++            qcount=qcount % 3;
    ++            if (qcount==2)
    ++                qcount=0;
    ++        }
    ++        else
    ++        {
    ++            /* a regular character */
    ++            bcount=0;
    ++            s++;
    ++        }
    ++    }
    ++    /* Allocate in a single lump, the string array, and the strings that go
    ++     * with it. This way the caller can make a single LocalFree() call to free
    ++     * both, as per MSDN.
    ++     */
    ++    argv=LocalAlloc(LMEM_FIXED, (argc+1)*sizeof(char*)+(strlen(lpCmdline)+1)*sizeof(char));
    ++    if (!argv)
    ++        return NULL;
    ++    cmdline=(char*)(argv+argc+1);
    ++    strcpy(cmdline, lpCmdline);
    ++
    ++    /* --- Then split and copy the arguments */
    ++    argv[0]=d=cmdline;
    ++    argc=1;
    ++    /* The first argument, the executable path, follows special rules */
    ++    if (*d=='"')
    ++    {
    ++        /* The executable path ends at the next quote, no matter what */
    ++        s=d+1;
    ++        while (*s)
    ++        {
    ++            if (*s=='"')
    ++            {
    ++                s++;
    ++                break;
    ++            }
    ++            *d++=*s++;
    ++        }
    ++    }
    ++    else
    ++    {
    ++        /* The executable path ends at the next space, no matter what */
    ++        while (*d && *d!=' ' && *d!='\t')
    ++            d++;
    ++        s=d;
    ++        if (*s)
    ++            s++;
    ++    }
    ++    /* close the executable path */
    ++    *d++=0;
    ++    /* skip to the first argument and initialize it if any */
    ++    while (*s==' ' || *s=='\t')
    ++        s++;
    ++    if (!*s)
    ++    {
    ++        /* There are no parameters so we are all done */
    ++        argv[argc]=NULL;
    ++        *numargs=argc;
    ++        return argv;
    ++    }
    ++
    ++    /* Split and copy the remaining arguments */
    ++    argv[argc++]=d;
    ++    qcount=bcount=0;
    ++    while (*s)
    ++    {
    ++        if ((*s==' ' || *s=='\t') && qcount==0)
    ++        {
    ++            /* close the argument */
    ++            *d++=0;
    ++            bcount=0;
    ++
    ++            /* skip to the next one and initialize it if any */
    ++            do {
    ++                s++;
    ++            } while (*s==' ' || *s=='\t');
    ++            if (*s)
    ++                argv[argc++]=d;
    ++        }
    ++        else if (*s=='\\')
    ++        {
    ++            *d++=*s++;
    ++            bcount++;
    ++        }
    ++        else if (*s=='"')
    ++        {
    ++            if ((bcount & 1)==0)
    ++            {
    ++                /* Preceded by an even number of '\', this is half that
    ++                 * number of '\', plus a quote which we erase.
    ++                 */
    ++                d-=bcount/2;
    ++                qcount++;
    ++            }
    ++            else
    ++            {
    ++                /* Preceded by an odd number of '\', this is half that
    ++                 * number of '\' followed by a '"'
    ++                 */
    ++                d=d-bcount/2-1;
    ++                *d++='"';
    ++            }
    ++            s++;
    ++            bcount=0;
    ++            /* Now count the number of consecutive quotes. Note that qcount
    ++             * already takes into account the opening quote if any, as well as
    ++             * the quote that lead us here.
    ++             */
    ++            while (*s=='"')
    ++            {
    ++                if (++qcount==3)
    ++                {
    ++                    *d++='"';
    ++                    qcount=0;
    ++                }
    ++                s++;
    ++            }
    ++            if (qcount==2)
    ++                qcount=0;
    ++        }
    ++        else
    ++        {
    ++            /* a regular character */
    ++            *d++=*s++;
    ++            bcount=0;
    ++        }
    ++    }
    ++    *d='\0';
    ++    argv[argc]=NULL;
    ++    *numargs=argc;
    ++
    ++    return argv;
    ++}
    ++
    ++int real_main(int argc, char* argv[]);
    ++
    ++int WINAPI _WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    ++    int argc;
    ++    char** argv=CommandLineToArgv(GetCommandLine(),&argc);
    ++    if(argv==NULL) return -1;
    ++    int ret=real_main(argc, argv);
    ++    LocalFree(argv);
    ++    return ret;
    ++}
    +diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/lua.c" ./lua.c
    +--- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/lua.c"    2007-12-28 21:32:23.000000000 +0600
    ++++ ./lua.c    2019-01-20 00:08:30.880574451 +0700
    +@@ -374,7 +374,7 @@
    + }
    +
    +
    +-int main (int argc, char **argv) {
    ++int real_main (int argc, char **argv) {
    +   int status;
    +   struct Smain s;
    +   lua_State *L = lua_open();  /* create state */
    +diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/luac.c" ./luac.c
    +--- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/luac.c"    2006-06-03 00:37:11.000000000 +0700
    ++++ ./luac.c    2019-01-20 00:08:41.068739525 +0700
    +@@ -183,7 +183,7 @@
    +  return 0;
    + }
    +
    +-int main(int argc, char* argv[])
    ++int real_main(int argc, char* argv[])
    + {
    +  lua_State* L;
    +  struct Smain s;
    +diff -Naur "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/Makefile" ./Makefile
    +--- "/home/stuntj/\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\270/lua-5.1.5/src/Makefile"    2012-02-14 03:41:22.000000000 +0700
    ++++ ./Makefile    2019-01-20 00:07:51.123930086 +0700
    +@@ -1,18 +1,19 @@
    +-# makefile for building Lua
    +-# see ../INSTALL for installation instructions
    +-# see ../Makefile and luaconf.h for further customization
    ++# makefile for building Lua see ../INSTALL for installation instructions see ../Makefile and luaconf.h for further customization
    +
    + # == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================
    +
    + # Your platform. See PLATS for possible values.
    ++CROSS=i686-w64-mingw32.static
    + PLAT= none
    +
    +-CC= gcc
    +-CFLAGS= -O2 -Wall $(MYCFLAGS)
    +-AR= ar rcu
    +-RANLIB= ranlib
    ++CC=$(CROSS)-clang
    ++LINKER=$(CROSS)-gcc
    ++AR=$(CROSS)-ar rcu
    ++RANLIB=$(CROSS)-ranlib
    ++PKG_CONFIG=$(CROSS)-pkg-config
    ++CFLAGS= -O3 -m32 -march=i486 -mfpmath=387 -m80387 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 -Wall
    + RM= rm -f
    +-LIBS= -lm $(MYLIBS)
    ++LIBS=-Wl,-nostdlib -nostdlib -lmingw32 -lmsvcrt -lkernel32 -lgcc $(MYLIBS)
    +
    + MYCFLAGS=
    + MYLDFLAGS=
    +@@ -27,38 +28,58 @@
    +     lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o  \
    +     lundump.o lvm.o lzio.o
    + LIB_O=    lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \
    +-    lstrlib.o loadlib.o linit.o
    ++    lstrlib.o loadlib.o linit.o dummydllmain.o
    +
    + LUA_T=    lua
    +-LUA_O=    lua.o
    ++LUA_O=    lua.o dummyprogmain.o
    +
    + LUAC_T=    luac
    +-LUAC_O=    luac.o print.o
    ++LUAC_O=    luac.o print.o dummyprogmain.o
    +
    + ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
    + ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
    + ALL_A= $(LUA_A)
    +
    ++
    ++%.ll: %.c
    ++    $(CC) $(CFLAGS) -S -emit-llvm -c -o $@ $<
    ++
    ++loslib.ll: loslib.c
    ++    $(CC) $(CFLAGS) -S -emit-llvm -c -o $<.ll $<
    ++    sed s/_difftime32/difftime/g $<.ll>$@
    ++
    ++lobject.ll: lobject.c
    ++    $(CC) $(CFLAGS) -S -emit-llvm -c -o $<.ll $<
    ++    sed s/__strtod/strtod/g $<.ll>$@
    ++
    + default: $(PLAT)
    +
    + all:    $(ALL_T)
    +
    +-o:    $(ALL_O)
    ++o:    $(ALL_O:.o=.ll)
    +
    + a:    $(ALL_A)
    +
    +-$(LUA_A): $(CORE_O) $(LIB_O)
    +-    $(AR) $@ $(CORE_O) $(LIB_O)    # DLL needs all object files
    +-    $(RANLIB) $@
    +-
    +-$(LUA_T): $(LUA_O) $(LUA_A)
    +-    $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)
    +-
    +-$(LUAC_T): $(LUAC_O) $(LUA_A)
    +-    $(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)
    ++llb.ll: $(CORE_O:.o=.ll) $(LIB_O:.o=.ll)
    ++    llvm-link -o $@ $(CORE_O:.o=.ll) $(LIB_O:.o=.ll)
    ++$(LUA_A): llb.ll
    ++    llc -filetype obj -O3 -march=x86 -mcpu=i486 -mattr=+x87 -o llb.ll.o llb.ll
    ++    $(LINKER) -shared -o $@ $<.o $(LIBS) --entry __DllMain@12
    ++
    ++lmf.ll: $(LUA_O:.o=.ll)
    ++    llvm-link -o $@ $(LUA_O:.o=.ll)
    ++$(LUA_T): lmf.ll $(LUA_A)
    ++    llc -filetype obj -O3 -march=x86 -mcpu=i486 -mattr=+x87 -o $<.o $<
    ++    $(LINKER) -o $@ $<.o $(LUA_A) $(LIBS) --entry __WinMain@16
    ++
    ++lcmf.ll: $(LUAC_O:.o=.ll)
    ++    llvm-link -o $@ $(LUAC_O:.o=.ll)
    ++$(LUAC_T): lcmf.ll $(LUA_A)
    ++    llc -filetype obj -O3 -march=x86 -mcpu=i486 -mattr=+x87 -o $<.o $<
    ++    $(LINKER) -o $@ $<.o $(LUA_A) $(LIBS) --entry __WinMain@16
    +
    + clean:
    +-    $(RM) $(ALL_T) $(ALL_O)
    ++    $(RM) $(ALL_T) $(ALL_O) *.o *.ll lua51.dll lua.exe luac.exe
    +
    + depend:
    +     @$(CC) $(CFLAGS) -MM l*.c print.c
    +@@ -105,9 +126,8 @@
    +
    + mingw:
    +     $(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \
    +-    "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
    +-    "MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe
    +-    $(MAKE) "LUAC_T=luac.exe" luac.exe
    ++    "MYCFLAGS=-DLUA_ANSI" lua.exe
    ++    $(MAKE) "LUA_A=lua51.dll" "LUAC_T=luac.exe" "MYCFLAGS=-DLUA_ANSI" luac.exe
    +
    + posix:
    +     $(MAKE) all MYCFLAGS=-DLUA_USE_POSIX
    +@@ -120,63 +140,63 @@
    +
    + # DO NOT DELETE
    +
    +-lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \
    ++lapi.ll: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \
    +   lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h \
    +   lundump.h lvm.h
    +-lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h
    +-lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h
    +-lcode.o: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
    ++lauxlib.ll: lauxlib.c lua.h luaconf.h lauxlib.h
    ++lbaselib.ll: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h
    ++lcode.ll: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
    +   lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h \
    +   ltable.h
    +-ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h
    +-ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \
    ++ldblib.ll: ldblib.c lua.h luaconf.h lauxlib.h lualib.h
    ++ldebug.ll: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \
    +   llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
    +   lfunc.h lstring.h lgc.h ltable.h lvm.h
    +-ldo.o: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
    ++ldo.ll: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
    +   lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h \
    +   ltable.h lundump.h lvm.h
    +-ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \
    ++ldump.ll: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \
    +   lzio.h lmem.h lundump.h
    +-lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \
    ++lfunc.ll: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \
    +   lstate.h ltm.h lzio.h
    +-lgc.o: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
    ++lgc.ll: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
    +   lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h
    +-linit.o: linit.c lua.h luaconf.h lualib.h lauxlib.h
    +-liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h
    +-llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \
    ++linit.ll: linit.c lua.h luaconf.h lualib.h lauxlib.h
    ++liolib.ll: liolib.c lua.h luaconf.h lauxlib.h lualib.h
    ++llex.ll: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \
    +   lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h
    +-lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h
    +-lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
    ++lmathlib.ll: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h
    ++lmem.ll: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
    +   ltm.h lzio.h lmem.h ldo.h
    +-loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h
    +-lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \
    ++loadlib.ll: loadlib.c lua.h luaconf.h lauxlib.h lualib.h
    ++lobject.ll: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \
    +   ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h
    +-lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h
    +-loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h
    +-lparser.o: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
    ++lopcodes.ll: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h
    ++loslib.ll: loslib.c lua.h luaconf.h lauxlib.h lualib.h
    ++lparser.ll: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
    +   lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
    +   lfunc.h lstring.h lgc.h ltable.h
    +-lstate.o: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
    ++lstate.ll: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
    +   ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h
    +-lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \
    ++lstring.ll: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \
    +   ltm.h lzio.h lstring.h lgc.h
    +-lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h
    +-ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
    ++lstrlib.ll: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h
    ++ltable.ll: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
    +   ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h
    +-ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h
    +-ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \
    ++ltablib.ll: ltablib.c lua.h luaconf.h lauxlib.h lualib.h
    ++ltm.ll: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \
    +   lmem.h lstring.h lgc.h ltable.h
    +-lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h
    +-luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \
    ++lua.ll: lua.c lua.h luaconf.h lauxlib.h lualib.h
    ++luac.ll: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \
    +   lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h \
    +   lundump.h
    +-lundump.o: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h \
    ++lundump.ll: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h \
    +   llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h
    +-lvm.o: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
    ++lvm.ll: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
    +   lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h ltable.h lvm.h
    +-lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \
    ++lzio.ll: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \
    +   lzio.h
    +-print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \
    ++print.ll: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \
    +   ltm.h lzio.h lmem.h lopcodes.h lundump.h
    +
    + # (end of Makefile)
    
    
    --- добавлено 19 янв 2019, предыдущее сообщение размещено: 19 янв 2019 ---
    Придумал лицензию. Как думаете, она легальна?
    Release in Public License (RiPL)
    The holder of the copyright "The Owner" gives you the permission to use the first source release of that "Software" under "The MIT license". Any contribution to this repository "A Contribution" is given by "The Contributor" to the "Owner" under the "MIT license". The "Owner" could re-license a "Contribution" under any license compatible with the license given to the "Owner" by the "Contributor". The "Owner" can make a stable release out of "Contributions" made by "Contributors" under any license compatible with the license given to the "Owner" by the "Contributors".
     
  20. SardaukarNN

    SardaukarNN

    Регистрация:
    5 сен 2013
    Сообщения:
    69
    Что это и для чего?
     
  21. bckpkol

    bckpkol

    Регистрация:
    18 мар 2011
    Сообщения:
    214
    @SardaukarNN, Если у кого ещё есть Windows 95, под неё ещё можно собирать программы :)
    Лень - двигатель прогресса.
    Кстати, из флейма тему попёрли. Обсуждаем только в ЛС, здесь нельзя.
     
    Последнее редактирование: 20 янв 2019
  22. SardaukarNN

    SardaukarNN

    Регистрация:
    5 сен 2013
    Сообщения:
    69
    Теперь ясно, правда смысла не вижу, не зависимо под какой ОС "сидишь" есть прекрасный пакет GCC, который позволяет программировать на любом языке, включая твою Lua, но лично я предпочитаю Си и C++. Что и зачем делать под Lua я не понимаю и не представляю!!! )))
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление