Как я могу скомпилировать гибридный (asm, C ++) исходный код в 32-битную программу? - PullRequest
0 голосов
/ 04 апреля 2019

Я использую 32-битный Cygwin под Win7 на 64-битном компьютере.

Следующая программа

makefile:

runme:  main.cpp    asm.o
        g++ main.cpp    asm.o   -o  executable

asm.o:  asm.asm
        nasm    -f  elf     asm.asm     -o  asm.o 

asm.asm:

section .data
section .bss
section .text
    global GetValueFromASM

GetValueFromASM:
    mov eax, 9
    ret

main.cpp:

#include <iostream>

using namespace std;

extern "C" int GetValueFromASM();

int main()
{
    cout<<"GetValueFromASM() returned = "<<GetValueFromASM()<<endl;

    return 0;
} 

выдает мне следующую ошибку:

$ make
nasm    -f      elf             asm.asm         -o      asm.o
g++     main.cpp        asm.o   -o      executable
/tmp/cc3F1pPh.o:main.cpp:(.text+0x26): undefined reference to `GetValueFromASM'
collect2: error: ld returned 1 exit status
make: *** [makefile:2: runme] Error 1

Я не понимаю, почему эта ошибкагенерируется.

Как мне избавиться от этой проблемы?

1 Ответ

2 голосов
/ 04 апреля 2019

Вы должны добавить к своим символам префикс _, как это принято в Windows / Cygwin:

section .data
section .bss
section .text
    global _GetValueFromASM

_GetValueFromASM:
    mov eax, 9
    ret

Остальная часть вашего кода должна работать нормально.

Альтернативой может быть компиляция с -fno-leading-underscore. Однако это может нарушить связь с другими (система Cygwin) библиотеками. Я предлагаю использовать первый вариант, если переносимость на другие платформы не имеет значения для вас.

Цитирование из документации GNU Online:

-fleading-underscore

Эта опция и ее аналог -fno-leading-underscore принудительно изменяют способ представления символов C в объектном файле. Одним из способов является помощь в связывании с унаследованным кодом сборки.

Предупреждение: переключатель -fleading-underscore заставляет GCC генерировать код, который не является двоичным, совместимым с кодом, созданным без этого переключателя. Используйте его для соответствия бинарному интерфейсу приложения не по умолчанию. Не все цели обеспечивают полную поддержку этого переключателя.

...