Russian Qt Forum

Компиляторы и платформы => Компиляторы => Тема начата: Hirurg от Июнь 08, 2021, 10:55



Название: [Решено] Сборка проекта с ассемблерным кодом компилятором MinGW 64-bit
Отправлено: Hirurg от Июнь 08, 2021, 10:55
Здравствуйте, помогите, пожалуйста, разобраться!
У меня есть два почти идентичных проекта, где в файлах с расширением .s написан ассемблерный код функции, вызывающей cpuid. Разница лишь в том, что один из них я компилирую в 32-битное приложение, а второй-в 64-битное, соответственно и отличаются они только ассемблерным кодом, а точнее названиями команд и регистров
Привожу код:
файл cpu_features.s из 32-битного варианта:
Код
ASM
   .global _cpu_features
   .section .text
   .def _cpu_features ; .scl 2 ; .type 32 ; .endef
_cpu_features:
   pushl %ebx
   pushl %ecx
   pushl %edx
   movl $1,%eax
   cpuid
   movl %edx,%eax
   popl %edx
   popl %ecx
   popl %ebx
   ret
файл cpu_features.s из 64-битного варианта:
Код
ASM
   .global _cpu_features
   .section .text
   .def _cpu_features ; .scl 2 ; .type 32 ; .endef
_cpu_features:
   pushq %rbx
   pushq %rcx
   pushq %rdx
   movq $1,%rax
   cpuid
   movq %rdx,%rax
   popq %rdx
   popq %rcx
   popq %rbx
   ret
два файла с объявлением и вызовом функции идентичны в обоих проектах:
cpu_features.h
Код
C++ (Qt)
#ifndef CPU_FEATURES_H
#define CPU_FEATURES_H
 
int cpu_features(void);
 
#endif // CPU_FEATURES_H
main.c
Код
C
#include <stdio.h>
#include "cpu_features.h"
 
int main()
{
   int f = cpu_features();
   printf("%d\n", f);
   return 0;
}
И ещё файл проекта:
Код:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += \
        main.c \
        cpu_features.s

HEADERS += \
    cpu_features.h

Для сборки использую комплекты Qt 5.12.11 MinGW под обе соответствующие разрядности.
Для 32-битной сборки никаких проблем нет, а под 64-бита получаю вот такой вывод:
Цитировать
10:35:13: Запускается: «D:\Qt\Tools\mingw730_64\bin\mingw32-make.exe» -j4
D:/Qt/Tools/mingw730_64/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'D:/QtProjects/tmp/build-CpuFeatures_x64-Desktop_Qt_5_12_11_MinGW_64_bit-Debug'
gcc -c -fno-keep-inline-dllexport -g -Wall -W -Wextra -DUNICODE -D_UNICODE -DWIN32 -DMINGW_HAS_SECURE_API=1 -DQT_QML_DEBUG -I..\CpuFeatures_x64 -I. -I..\..\..\Qt\5.12.11\mingw73_64\mkspecs\win32-g++  -o debug\main.o ..\CpuFeatures_x64\main.c
gcc -c -fno-keep-inline-dllexport -g -Wall -W -Wextra -DUNICODE -D_UNICODE -DWIN32 -DMINGW_HAS_SECURE_API=1 -DQT_QML_DEBUG -I..\CpuFeatures_x64 -I. -I..\..\..\Qt\5.12.11\mingw73_64\mkspecs\win32-g++  -o debug\cpu_features.o ..\CpuFeatures_x64\cpu_features.s
g++ -Wl,-subsystem,console -mthreads -o debug\CpuFeatures_x64.exe debug/main.o debug/cpu_features.o  
debug/main.o: In function `main':
D:\QtProjects\tmp\build-CpuFeatures_x64-Desktop_Qt_5_12_11_MinGW_64_bit-Debug/../CpuFeatures_x64/main.c:6: undefined reference to `cpu_features'
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [Makefile.Debug:68: debug/CpuFeatures_x64.exe] Error 1
mingw32-make[1]: Leaving directory 'D:/QtProjects/tmp/build-CpuFeatures_x64-Desktop_Qt_5_12_11_MinGW_64_bit-Debug'
mingw32-make: *** [Makefile:38: debug] Error 2
10:35:15: Процесс «D:\Qt\Tools\mingw730_64\bin\mingw32-make.exe» завершился с кодом 2.
Ошибка при сборке/развёртывании проекта CpuFeatures_x64 (комплект: Desktop Qt 5.12.11 MinGW 64-bit)
Во время выполнения этапа «Сборка»
10:35:15: Прошло времени: 00:03.
Ниже прикреплю оба проекта в архивах, подскажите пожалуйста, как собрать проект под x64?


Название: Re: Сборка проекта с ассемблерным кодом компилятором MinGW 64-bit
Отправлено: alex312 от Июнь 09, 2021, 14:57
Код
C++ (Qt)
int f = _cpu_features();
 

в 64битной версии надо пользовать нижнее подчеркивание. Т.е имя функции в С части совпадает с именем в ассемблере.


Название: Re: Сборка проекта с ассемблерным кодом компилятором MinGW 64-bit
Отправлено: Hirurg от Июнь 11, 2021, 09:28
Спасибо, огромное! Догадывался, что не учитываю какой-то нюанс, но нигде не мог найти нужную информацию. Заработало!