schizo
Produkt der Gesellschaft
|
In dem im Anhang befindlichen Code (kompilierbar mit einer aktuellen gcc Version) versuche ich eine externe Funktion aufzurufen (poly1305_aes_ppro_authenticate), für welche das Headerfile angegeben ist. Leider kenn ich mich nicht gut genug mit dem einbinden von externen Funktionen aus, um das Problem mit Hilfe von Google zu lösen. Ich bin mir nichtmal sicher, ob überhaupt der Code selbst dran Schuld ist, oder ob sich der Fehler nicht sogar rein aufs makefile beschränkt ![:(](/images/smilies/frown.gif) Auszug aus dem cpp file: #ifndef AES_PPRO_H
#define AES_PPRO_H
#include "aes_ppro.h"
#endif
#ifndef POLY1305_PPRO_H
#define POLY1305_PPRO_H
#include "poly1305_ppro.h"
#endif
#ifndef POLY1305AES_PPRO_H
#define POLY1305AES_PPRO_H
#include "poly1305aes_ppro.h"
#endif
extern void poly1305_aes_ppro_authenticate(unsigned char out[16], const unsigned char kr[32], const unsigned char n[16], const unsigned char m[], unsigned int bytelen);
Makefile: CC=g++
CFLAGS=-c -L/usr/lib/ -masm=intel
LDLIBS=-L/usr/lib/ -lcryptopp -L/usr/lib -lgmp -L/usr/lib -lssl -lcrypto
all: mac
mac: mac.o
$(CC) poly1305aes_ppro_authenticate.c mac.o -o mac $(LDLIBS)
mac.o: mac.cpp
$(CC) $(CFLAGS) mac.cpp
clean:
rm -rf *o mac
mac1_199206.zip (downloaded 114x)
Bearbeitet von schizo am 12.12.2014, 17:59
|
Nico
former person of interest
|
die include guard zeilen gehören in die header files.
|
schizo
Produkt der Gesellschaft
|
Dort sind sie auch drin. Ich hab sie im Laufe der Fehlersuche nur noch zusätzlich ins main file geschrieben
|
Nico
former person of interest
|
was keinen sinn macht.
Lies mal das make manual und zieh auch das gcc manual bezüglich lib linken zu rate. Dafür sind sie schließlich da.
|
schizo
Produkt der Gesellschaft
|
Das hab ich schon gemacht. Darum hab ich auch geschrieben, dass es sich vermutlich um ein Verständnisproblem, welches ich nicht mit Google lösen kann (zumindest hätte ich die passenden Suchbegriffe noch nicht gefunden). Ich wende mich keineswegs hierhin, wenn ein Problem auftritt, um mich selbst damit nicht zu beschäftigen.
Das gcc manual bez. lib linken würde mir hier btw. auch nicht weiterhelfen, nachdem ich im konkreten Fall keine lib verwende (wie ich diese einbinden würde weiß ich - die im makefile angegebenen libs sind ein überbleibsel eines Codes, den ich gekürzt habe um diesen übersichtlicher zu gestalten), sondern sämtlicher verwendeter code in im selben Verzeichnis liegenden Dateien befindet.
|
Ringding
Pilot
|
Ohne den Text schon gelesen zu haben, riecht es nach extern "C" { ... }.
|
schizo
Produkt der Gesellschaft
|
Ohne den Text schon gelesen zu haben, riecht es nach extern "C" { ... }. Darauf bin ich zwar auch schon öfters gestoßen, jedoch ist dies nicht die Lösung des Problems
|
Ringding
Pilot
|
Ich kann’s frühestens am Abend genauer anschauen, aber du solltest jedenfalls beide Sourcefiles einzeln übersetzen, mit -c. Und dann das executable bauen, indem du die beiden .o-Files zusammenlinkst. Und das C-File solltest du wohl auch mit gcc compilieren, nicht mit g++.
|
schizo
Produkt der Gesellschaft
|
Ich kann’s frühestens am Abend genauer anschauen, aber du solltest jedenfalls beide Sourcefiles einzeln übersetzen, mit -c. Und dann das executable bauen, indem du die beiden .o-Files zusammenlinkst. Und das C-File solltest du wohl auch mit gcc compilieren, nicht mit g++. Danke fürs drüberschauen! Ursprünglich waren noch andere c++ Funktionen drin, darum hab ich bis jetzt g++ verwendet. Aber im Grunde is es kein Problem, den Teil abzuspalten und auf c zu wechseln. Ich hab im makefile soeben die von dir genannten Punkte geändert, die Fehlermeldung bleibt jedoch dieselbe.
mac1_199213.zip (downloaded 102x)
|
Ringding
Pilot
|
1. Da ist ja 32-Bit-Code drinnen. Baust du auf einem 32bittigen System?
2. Du musst wohl die ganzen Assemblerfiles (*.s) auch dazulinken.
|
schizo
Produkt der Gesellschaft
|
Leider gibts von dem Code keine 64 Bit Variante. Aber ja, ich builde auf nem 32Bit OS. Ich hab das makefile jetzt noch von altem Code befreit und die Assablerfile dazugellinkt, bekomme aber nach wie vor denselben Fehler. Außerdem regt sich der compiler jetzt auf, dass in den übernommenen sourcefiles keine main() Funktion enthalten ist (-c Flag ist gesetzt). CC=gcc
CFLAGS=-c -L/usr/lib/ -masm=intel
LDLIBS=
all: poly1305aes_ppro_authenticate poly1305aes_ppro_clamp mac
mac: mac.o poly1305aes_ppro_authenticate.o poly1305aes_ppro_authenticate.o aes_ppro.o poly1305_ppro.o poly1305aes_ppro.o
$(CC) -g -o mac mac.o poly1305aes_ppro_clamp.o poly1305aes_ppro_authenticate.o aes_ppro.o poly1305_ppro.o poly1305aes_ppro.o
mac.o: mac.cpp
$(CC) $(CFLAGS) mac.cpp
poly1305aes_ppro_authenticate.o: poly1305aes_ppro_authenticate.c
$(CC) $(CFLAGS) poly1305aes_ppro_authenticate.c
poly1305aes_ppro_clamp.o: poly1305aes_ppro_clamp.c
$(CC) $(CFLAGS) poly1305aes_ppro_clamp.c
poly1305_ppro.o: poly1305_ppro.s
$(CC) $(CFLAGS) poly1305_ppro.s
poly1305aes_ppro.o: poly1305aes_ppro.s
$(CC) $(CFLAGS) poly1305aes_ppro.s
aes_ppro.o: aes_ppro.s
$(CC) $(CFLAGS) aes_ppro.s
clean:
rm -rf *o mac
|
Ringding
Pilot
|
Aber was ist jetzt der genaue Wortlaut des Fehlers?
|
schizo
Produkt der Gesellschaft
|
mk@mk-virtual-machine:~/Documents/MAC1$ make
gcc poly1305aes_ppro_authenticate.o -o poly1305aes_ppro_authenticate
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
...
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
poly1305aes_ppro_authenticate.o: In function `poly1305aes_ppro_authenticate':
poly1305aes_ppro_authenticate.c:(.text+0x3e): undefined reference to `aes_ppro'
poly1305aes_ppro_authenticate.c:(.text+0x68): undefined reference to `poly1305_ppro'
collect2: error: ld returned 1 exit status
make: *** [poly1305aes_ppro_authenticate] Error 1
|
Ringding
Pilot
|
Kannst du einen diff lesen? Solltest du ![:)](/images/smilies/smile.gif) . (Minus-Zeilen weg, Plus-Zeilen dazu) So geht’s. --- a/mac.cpp
+++ b/mac.cpp
@@ -9,7 +9,6 @@
#include "aes_ppro.h"
#include "poly1305_ppro.h"
#include "poly1305aes_ppro.h"
-extern void poly1305_aes_ppro_authenticate(unsigned char out[16], const unsigned char kr[32], const unsigned char n[16], const unsigned char m[], unsigned int bytelen);
@@ -43,7 +42,7 @@
lapclk[0]=clock();
for(int i=0; i<rounds; i++){
- poly1305_aes_ppro_authenticate(out, kr[i], n[i], m[i], bytelen);
+ poly1305aes_ppro_authenticate(out, kr[i], n[i], m[i], bytelen);
}
lapclk[1]=clock();
--- a/poly1305aes_ppro.h
+++ b/poly1305aes_ppro.h
@@ -7,6 +7,10 @@
#ifndef POLY1305AES_PPRO_H
#define POLY1305AES_PPRO_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
extern void poly1305aes_ppro_clamp(unsigned char kr[32]);
extern void poly1305aes_ppro_authenticate(unsigned char out[16],
@@ -29,4 +33,8 @@
extern int poly1305aes_ppro_isequal(const unsigned char x[16],
const unsigned char y[16]);
+#ifdef __cplusplus
+}
+#endif
+
#endif
Makefile: objects = aes_ppro.o aes_ppro_constants.o poly1305_ppro.o poly1305_ppro_constants.o poly1305aes_ppro_authenticate.o poly1305aes_ppro_clamp.o mac.o
all: mac
mac: $(objects)
$(CXX) -g -o $@ $(objects)
clean:
rm -rf *o mac
|
schizo
Produkt der Gesellschaft
|
![:eek:](/images/smilies/eek.gif) thx vielmals, du hast mir sehr geholfen!
|