Скачал исходники: https://github.com/mistalro/atariconv Поправил Makefile — заменил LIBS = -lcurses на LIBS = -lncurses -ltinfo, CFLAGS = -g на CFLAGS = -g -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 (что выдал pkg-config для ncurses). Запустил — собралось (GCC 14) с предупреждениями, что несколько int функций ничего не возвращают.
Запускаю программу без параметров — нормально показывает справку. Запускаю более сложную задачу (конвертировать файл) — падает с ошибкой «Недопустимая инструкция», в dmesg в соответствующий момент — «trap invalid opcode». Попробовал явно указывать архитектуру процессора — не помогло. Думал, ассемблерные вставки — не нашёл.
В итоге помогло заменить в мейкфайле GCC = g++ на GCC = gcc. Даже пропали предупреждения про int и return. Поэтому возникли вопросы:
-
Я правильно понимаю, что g++ компилировал как C++, а gcc скомпилировал как Си? — Ответ: Да.
-
Из-за чего возникала ошибка? Пыталось исполнять данные как код? — Ответ: G++ в конце не-void функций без return вставляет команду процессора UD2, вызывающую ошибку «неопределенный код операции», если программа дойдёт до этого места.
-
Какой был смысл указывать дефолтный компилятор g++? Исходники последний раз меняли в 2015 году, в копирайтах указан 2010, а местами вообще 2000 год. С тех пор что-то принципиально поменялось?
UPD: Если в проблемные функции добавить в конце return 0;, то собирается G++ без предупреждений и работает. Корректность особо не проверял.


