Разница в том, что связанный вывод из набора инструментов arm-elf-xxx является загружаемым двоичным файлом linux, в то время как arm-linux-xxx выводит объект ядра (ko), который является BLOB-объектом с собственным форматом связи (для модулей ), или основное ядро, которому не нужен формат упаковки. То есть, для пользовательского пространства вы хотите, чтобы конечный динамически связанный объект был исполняемым файлом ELF, библиотекой или общим объектом. Что касается пространства ядра, вы хотите, чтобы конечный объект (ядро или модуль) был в формате связи linux-arm-kernel.
Вы заметите, что промежуточные объекты (файлы .o) обеих целей, вероятно, все являются ELF, поскольку именно этого ожидает цепочка инструментов.