Украшение имени Fastcall в Windows нелегко переносить
Я использую mingw в Windows для компиляции кода на C и сборки, некоторые функции в которой имеют соглашение о вызовах fastcall (как его определяет Microsoft). Если я использую __fastcall в объявлении, mingw делает то, что делает Windows, и name украшает:
Знак at (@) ставится перед именами; знак at, за которым следует число байтов (в десятичной дроби) в списке параметров, добавляется к именам
Это отлично работает. У меня есть этикетки в сборке в виде:
.global @myfunction@4
@myfunction@4:
....code....
Но это оказывается большой проблемой, когда я портирую на Linux (x86, 32 бит). Gcc внезапно не любит __fastcall (или __cdecl в этом отношении) и вообще не любит @ в ярлыках. Я не уверен, как я могу объединить эти две проблемы - либо получить gcc в Linux как @ или получить mingw в Windows, чтобы не добавлять @.
Также: я могу использовать __attribute__(__cdecl__)
на месте __cdecl
но я озадачен тем, куда это идет. Я предполагал перед именем самой функции, но вижу, что люди ставят его после объявления и перед точкой с запятой. Могу ли я сделать либо?
1 ответ
Связанный ответ: Добавление лидирующих подчеркиваний в символы ассемблера с помощью GCC на Win32?
Декорирование имени является общей темой при портировании между операционными системами, платформами и даже процессорами на одной платформе (например, от IA32 до IA64 теряет подчеркивание).
Я решил это путем удаления @ украшения из всех функций, которые его использовали, поскольку мне не нужно было экспортировать их, кроме как для тестирования. Другие функции были переопределены из функции в функцию _function с помощью макросов (для этого, в конце концов, и нужны ассемблеры макросов).
В этом случае я переименовал код ассемблера из.s в.sx (платформа Windows) и с помощью препроцессора gcc проверил наличие _WIN32 и, таким образом, переопределил экспорт глобальных символов, чтобы иметь начальные подчеркивания. То же самое для вызовов _calloc и _free.