Я реализовал достаточно хороший оптимизирующий компилятор (для игрушечного языка) и натолкнулся на довольно загадочный сценарий. Я могу взять входной файл и произвести сборку из него, так что в этом отношении «компилятор» закончен. Если я возьму этот файл сборки, соберу его с помощью NASM и свяжу его с моей библиотекой поддержки времени выполнения с помощью G ++ (для среды выполнения требуется libstdc ++), я получу работающий исполняемый файл без ошибок. Тем не менее, я хотел бы иметь возможность компилировать в исполняемый файл в одной команде, поэтому я добавил несколько вызовов system
моему компилятору, передав ТОЧНЫЕ ЖЕ КОМАНДЫ, которые я использовал в bash. Когда я запускаю компилятор, он, кажется, собирается правильно, но шаг компоновки (опять же с использованием g ++) завершается неудачно с undefined reference to main
, Смущенный, я попытался связать вручную (без повторной сборки, поэтому я использовал объектный файл, созданный NASM, запущенным с system
и получил ту же ошибку. Если я соберусь заново, используя вывод сборки нового компилятора, у меня не возникнет проблем, из-за чего можно было бы поверить, что проблема заключается в NASM. Как я уже сказал, команды абсолютно одинаковы (я буквально скопировал и вставил их, чтобы убедиться после первого раза). Это переменные среды или что-то? В чем дело?
РЕДАКТИРОВАТЬ:
Я вручную собрал объектный файл, снова используя ту же команду, что и в компиляторе, и я сделал vim diff между ними. Генерируемый компилятором, кажется, содержит только заголовок ELF.
РЕДАКТИРОВАТЬ 2:
Скриншот различий
РЕДАКТИРОВАТЬ 3:
Я пытался с помощью system
вызвать Perl-скрипт, который, в свою очередь, вызовет NASM и G ++, все равно не повезло.
Починил это! Это был файл, который не был сброшен из-за состояния гонки. Спасибо за помощь, высоко ценится.
Других решений пока нет …