Сбой objcopy на make-файле, но нет проблем при вводе его вручную в Терминале - PullRequest
0 голосов
/ 30 января 2020

У меня есть этот Makefile со следующими командами:

all:
    gcc -MD -fno-builtin -nostdinc -fno-stack-protector -Os -g -m32 -I. -c -o boot0.o boot0.S
    ld -nostdlib -m elf_i386 -N -e start -Ttext 0x7c00 -o boot0.elf boot0.o
    objcopy -S -O binary boot0.elf boot0
    ....

Пока эти команды предварительно написаны, я просто копирую и вставляю в make-файл, а я делаю

make all

в терминале он вернет

make: objcopy: command not found

Это невозможно, учитывая, что я запускаю Xubuntu через VMBox. Но позже я узнал, что если я введу эту команду вручную, она будет работать. Но это не сработает, если я скопирую и вставлю команду в терминал. Даже если я вставлю его, мне нужно будет набрать objcopy, чтобы оно заработало. Но этот трюк не работает на make-файле. Также это происходит на gcc и ld, но оба они в конечном итоге сработали, когда я снова набрал команду в makefile, но не objcopy. В чем здесь проблема?

1 Ответ

1 голос
/ 30 января 2020

Но позже я узнал, что если я введу эту команду вручную, она будет работать. Но это не сработает, если я скопирую и вставлю команду в терминал. Даже если я вставил его, мне нужно повторно ввести objcopy, чтобы заставить его работать.

Если копирование и вставка команды в окно терминала не работает, но ввод вручную (повторный) команда в том же окне терминала работает, затем следует, что вы на самом деле не вводите одну и ту же команду.

Также это происходит на g cc и ld, но оба они в конечном итоге сработали когда я снова набрал команду в makefile, но не в objcopy.

Это в значительной степени пригвоздило ее для меня. Вероятно, ваш make-файл содержит непечатаемые символы, которые Ubuntu не распознает как пробелы. По крайней мере, один такой символ находится непосредственно рядом с каждым именем команды, возможно, непосредственно перед ним, имя команды интерпретируется как включающее этот символ. Более того, вы можете вырезать и вставить это вместе с командой, но, конечно, это не так, если вы просто наберете то, что кажется командой в make-файле.

Иногда возникает похожая проблема, связанная с Windows терминаторы строки вместо Unix терминаторы строки, но здесь это не так. Я предполагаю, что это могло произойти из-за копирования содержимого make-файла с веб-страницы.

Вы можете отфильтровать все такие символы из вашего make-файла, обработав его командой tr :

tr -cd '\t\n\040-\176' < Makefile > Makefile.new

Содержит символы табуляции, перевода строки и символы ASCII от 040 до 176 восьмеричного числа (== 32 - 126 десятичных == 20 - 7e шестнадцатеричных). Вы сможете узнать, изменилось ли что-нибудь, сравнив размеры исходного и нового файлов. Предположим, что новый файл меньше и выглядит нормально, впереди go и замените оригинальный.

...