Кросс-компилятор G CC для DOS выдает ошибки компоновщика для простого "Hello world!" в C - PullRequest
2 голосов
/ 21 июня 2020

Я пытался настроить G CC 9.3.0 для создания исполняемых файлов для DOS. Однако для простого «Привет, мир!» программа в C, она выводит:

/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0xd6): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0x10b): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0x131): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0x141): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0x3d4): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(getenv.o):getenv.c:(.text+0x4): more undefined references to `_environ' follow
collect2: error: ld returned 1 exit status

djgpp-gcc -v выводит:

Using built-in specs.
COLLECT_GCC=djgpp-gcc
COLLECT_LTO_WRAPPER=/home/teo.samarzija/djgpp-9.3.0/libexec/gcc/djgpp/9.3.0/lto-wrapper
Target: djgpp
Configured with: ../gcc-9.3.0/configure --target=djgpp --prefix=/home/teo.samarzija/djgpp-9.3.0 --enable-languages=c,c++,objc,ada,fortran,go
Thread model: single
gcc version 9.3.0 (GCC) 

Я также скомпилировал последнюю версию компоновщика GNU и GNU Assembler, они выводят как их версии:

GNU ld (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.

и

GNU assembler (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `djgpp'.

Есть идеи, что я делаю неправильно? Прекращали ли G CC, GAS или GLD поддерживать DOS когда-нибудь в прошлом? Я полагаю, что нет, потому что они компилируются для DOS в качестве цели без предупреждения об этом.

1 Ответ

2 голосов
/ 25 июня 2020

Я наткнулся на этот вопрос только из-за недавнего вопроса о стеке , который вы спросили о каком-то коде, который не работал должным образом в 32-битном Windows 10 внутри сеанса виртуальной DOS NTVDM.

Проблема в том, что вы неправильно собрали кросс-компилятор DJGPP и все необходимые компоненты. Вы не показываете нам, какие команды вы используете для процесса сборки, какие версии зависимостей использовались и откуда они взялись.

Первое, что вам нужно сделать, это создать кросс-компилятор DJGPP. Есть люди, которые поддерживают сценарии именно для этого. В частности, я успешно использовал одну среду / сценарий сборки, полученную от пользователя Andrew Wu на Github . Очень просто использовать. Похоже, что вы используете среду типа Unix на основе результатов, которые вы нам показали. Поскольку вам удалось собрать DJGPP (хотя он и не работает), я предполагаю, что у вас уже установлены все необходимые инструменты сборки. Сначала загрузите сценарии с помощью:

git clone https://github.com/andrewwutw/build-djgpp

Перейдите в каталог проекта с помощью:

cd build-djgpp

Просмотрите файл README.md! Он сообщает вам, какие версии поддерживаются сценарием, требования к сборке для вашего типа ОС et c. В настоящее время они поддерживают версии до 10.1.0. Если у вас есть все необходимое, выберите версию для сборки (я буду использовать 9.3.0, поскольку это версия, которую вы используете), а затем запустите сборку. Вам нужно будет собрать как root или использовать sudo при установке в каталог /usr/local/djgpp

./build-djgpp.sh 9.3.0

Это займет некоторое время, но по завершении он должен быть установлен и готов к использованию. Соглашение об именах немного отличается от префикса команд с помощью djgpp-. Этот скрипт создает вещи с более полным целевым префиксом i586-pc-msdosdjgpp-

Чтобы добавить его в свой путь и настроить другие переменные среды, используйте:

. /usr/local/djgpp/setenv

Если вы используете sh, это должно быть будет выполняться каждый раз, когда вы входите в систему, добавляйте эту строку в сценарий входа в оболочку. Для BASH, который находится в файле ~/.bashrc

Создайте файл с именем hello.c, содержащий:

#include<stdio.h>

int main()
{
    printf("Hello, world!\n");
}

Скомпилируйте его в файл с именем hello.exe:

i586-pc-msdosdjgpp-gcc -O3 -Wall -Wextra hello.c -o hello.exe 

Предполагая, что у вас установлен хост DPMI (например, CWSDPMI.EXE), hello.exe должен работать в MS-DOS, FreeDOS, DOSBox, сеансе Windows NTVDM и т.д. c. При запуске должно отображаться:

Привет, мир!

Если у вас нет sh для сборки с нуля, у Andrew Wu есть несколько готовых пакетов для ряда последних выпусков DJGPP. Платформы, для которых они доступны: MacOS, Linux 32, Linux 64, MinGW и автономная версия MinGW, для работы которой не требуется среда MinGW.

...