Неопределенные ссылки при связывании сборки и C ++ с использованием g ++ - PullRequest
2 голосов
/ 25 января 2012

Я должен написать некоторые функции-члены класса в Assembly для экзамена. Я следовал каждой инструкции, но все еще не могу заставить ее работать. Вот соответствующие файлы. Заголовок и метод main уже предоставлены, мне просто нужно написать конструктор и метод elab1.

Заголовок класса

#include <iostream>
using namespace std;
struct st { int a; int vv1[4]; double vv2[4]; };
class cl 
{   double b; st s;
public:
    cl(int *p, double *d);
    void elab1(st ss);
    void stampa()
    {   int i; cout << b << ' ' << s.a << endl;
        for (i=0;i<4;i++) cout << s.vv1[i] << ' '; cout << '\t';
        for (i=0;i<4;i++) cout << s.vv2[i] << ' '; cout << endl;
        cout << endl;
    }
};

Основной метод испытаний

// prova1.cpp
#include "cc.h" // class header
int main()
{
    st s = {1, 1,2,3,4, 1,2,3,4  };
    int v[4] = {10,11,12,13 };
    double d[4] = { 2, 3, 4, 5 };
    cl cc1(v, d);
    cc1.stampa();
    cc1.elab1(s);
    cc1.stampa();
}

А это моя сборка :

# es1.s
.text
.global __ZN2clC1EPiPe

__ZN2clC1EPiPe:

    pushl %ebp
    movl %esp, %ebp
    subl $4, %esp       

    pushl %eax
    pushl %ebx
    pushl %ecx
    pushl %edx
    pushl %esi

    cmpl $0, 12(%ebp)
    je fine
    cmpl $0, 16(%ebp)
    je fine

    movl 8(%ebp), %eax  
    movl 12(%ebp), %ebx
    movl 4(%ebx), %ecx
    movl %ecx, 12(%eax)

    fldz
    fstpl (%eax)

    movl $0, -4(%ebp)

ciclo:

    cmpl $4, -4(%ebp)
    je fine

    movl -4(%ebp), %esi     
    movl 12(%ebp), %ebx
    movl (%ebx, %esi, 4), %ecx
    subl %esi, %ecx     
    movl %ecx, 16(%eax, %esi, 4)

    movl 16(%ebp), %ebx
    pushl %eax
    movl %esi, %eax
    movl $3, %ecx
    imull %ecx
    movl %eax, %edx
    popl %eax

    movl 12(%ebp), %ecx

    fldl (%ebx, %edx, 4)
    fldl (%ecx, %esi, 4)
    faddp %st, %st(1)

    fstpl 32(%eax, %edx, 4)

    fldl (%ebx, %edx, 4)
    fldl (%eax)
    faddp %st, %st(1)

    fstpl (%eax)

    incl -4(%ebp)
    jmp ciclo

fine:

    popl %esi
    popl %edx
    popl %ecx
    popl %ebx
    popl %eax

    movl 8(%ebp), %eax

    leave
    ret

.global __ZN2cl5elab1E2st

__ZN2cl5elab1E2st: #TODO

Я пытаюсь скомпилировать и связать все с помощью инструкции командной строки, которая была предоставлена ​​нам:

g++ -o es1 -fno-elide-constructors es1.s prova1.cpp

но это только дает мне кучу undefined reference s:

/tmp/ccbwS0uN.o: In function `main':
prova1.cpp:(.text+0xee): undefined reference to `cl::cl(int*, double*)'
prova1.cpp:(.text+0x192): undefined reference to `cl::elab1(st)'
collect2: ld returned 1 exit status

У вас есть идеи, как я могу решить эту проблему? Я подумал, что, возможно, я неправильно перевел имена функций, но проверял их несколько раз.

1 Ответ

3 голосов
/ 25 января 2012

Примените c++filt к своему имени и сопоставьте с подписью в сообщении об ошибке.

При удалении одного подчеркивания и фильтрации с использованием фильтра c ++ я получаю искаженное имя cl::cl(int*, long double*), которое не совпадает ни с одним в сообщении об ошибке / объявлении класса.

Правильно искаженное имя должно быть _ZN2clC1EPiPd для cl::cl(int*, double*).

Я предлагаю вам улучшить способ (каким бы он ни был), чтобы получить искаженное имя.

...