Как сообщить компоновщику g ++, что в сборке x86-64 реализована внешняя функция add (объектный файл)? - PullRequest
4 голосов
/ 21 мая 2019

Я озадачен, почему компоновщик не ссылается на функцию в объектном файле.

Я реализовал функцию на языке ассемблера x86-64 и с помощью -f elf64 сгенерировал объектный файл.(Ubuntu - моя целевая ОС.) Объектный файл был успешно сгенерирован, но попытка скомпилировать мой проект C ++ с вышеупомянутым объектным файлом приводит к тому, что компоновщик не находит мою определенную функцию (внутри объектного файла).Компиляция была сделана так:

g++ -W -Wall -pedantic -g -std=c++17 main.cpp SSE_Ubuntu_Tuple.cpp SSE_Ubuntu_Tuple.o -o test
#ifndef MATH_TUPLE_HPP
#define MATH_TUPLE_HPP

namespace Math
{
    struct Tuple
    {
        float components[4]; // x, y, z, w
        Tuple(float, float, float, float);
        Tuple operator+(Tuple&) const;
    }; // struct Tuple
} // namespace Math

#endif // MATH_TUPLE_HPP
section .text
global sse_ubuntu_tuple_add

; rdi = &x, rsi = &y

sse_ubuntu_tuple_add:
    movdqa xmm0, [rdi] ; xmm0 = *rdi
    addps xmm0, [rsi] ; *rdi + *rsi
    movdqa [rdi], xmm0 ; *rdi = xmm0
    ret

#include "Tuple.hpp"
#include <algorithm>

namespace Math
{
    extern void sse_ubuntu_tuple_add(float[4], float[4]);

    Tuple::Tuple(float t_x, float t_y, float t_z, float t_w) : components{t_x, t_y, t_z, t_w} {}
    Tuple Tuple::operator+(Tuple& t_rhs) const
    {
        float sum[4]{};
        constexpr int number_of_components = 4;
        std::copy(components, components + number_of_components, sum);
        sse_ubuntu_tuple_add(sum, t_rhs.components);
        return Tuple(sum[0], sum[1], sum[2], sum[3]);
    }
} // namespace Math

Я ожидал безошибочной компоновки и компиляции.

1 Ответ

5 голосов
/ 21 мая 2019

Вам нужно объявить sse_ubuntu_tuple_add как extern "C":

extern "C" void sse_ubuntu_tuple_add(float[4], float[4]);

Кроме того, в некоторых системах в файле сборки может потребоваться создать символ с начальным подчеркиванием: _sse_ubuntu_tuple_add.

Редактировать: очевидно, с ELF вам не нужно подчеркивание.

...