64-битное соглашение о вызовах x86: отличается для windows и linux.
См .: https://en.wikipedia.org/wiki/X86_calling_conventions В частности, Microsoft x64 «Соглашение о вызовах» и «System V AMD64 ABI».
В Windows первые четыре аргумента передаются в регистрах. Но при linux первые шесть аргументов передаются в регистрах.
И какой регистр содержит, какой аргумент [снова] отличается:
arg0 arg1 arg2 arg3 arg4 arg5
Windows: RCX RDX R8 R9
Linux: RDI RSI RDX RCX R8 R9
Кроме того, какие регистры должны быть сохранены вызываемым пользователем, который может быть уничтожен, и т. Д. c.
Использование gcc
в Windows (cygwin
или mingw
) будет использовать соглашение MS. Использование gcc
под WSL будет использовать соглашение Ubuntu / linux SysV ABI (т.е. linux).
Таким образом, вы не можете просто сделать кросс-компиляцию без какой-либо опции, чтобы сказать компилятору используйте правильное соглашение о вызовах. Также, возможно, есть проблемы с динамическими c библиотеками (под MS они .dll
, но под linux они .so
).
Также windows использует PE
формат (переносимый исполняемый файл) [полученный из формата SysV COFF
]. Но linux использует ELF
объектный / двоичный исполняемый формат.
Примечание: IIR C, MS просто решила поддерживать VS под linux [но это совсем недавно ], так что вы можете получить некоторое облегчение там.
Но, IMO, я бы просто использовал gcc
et. и др. под WSL / ubuntu / linux. И, , если вам действительно нужна IDE, попробуйте Eclipse.
Вы можете попытаться получить VS для перекрестной сборки, но, IMO, знак на стене: Оставьте надежду всем, кто войдет сюда
ОБНОВЛЕНИЕ:
Предупреждение: Я разместил выше основано на оригинальном посте ФП [без каких-либо комментариев из верхних комментариев (о том, как gcc
использовалось)]. Но чем больше я об этом думаю, тем меньше в этом смысла.
Но возникает вопрос: используете ли вы WSL
или WSL2
? Они реализованы по-разному.
С WSL
MS просто добавила дополнительную поддержку linux совместимого интерфейса syscall для ядра win10. Он может выполнять ограниченное количество программ. AFAIK, программы все еще использовали собственную файловую систему NTFS
. Вы не используете linux ядро , просто выполняете некоторые linux ABI-совместимые исполняемые файлы.
С WSL2
MS внедрила облегченную виртуальную машину [похоже на vmware
или virtualbox
], позволяющее запустить полное ядро Ubuntu / linux. При этом вы можете установить Ubuntu, загрузив ВМ из «живой» установки Ubuntu .iso
(прямо с сайта Ubuntu). Затем он устанавливается [в значительной степени] точно так же, как и нативная установка Ubuntu.
Поскольку WSL2
является виртуальной машиной, вы можете установить fedora
, suse
, mint
и др. c. аналогичным образом.