lundi 14 octobre 2013

PGP on linux 64bits x86_64

Compilation de PGP sur linux 64bits

http://www.pgpi.org


English Reader summary : 
I tried to compile pgp for 64bits architecture,  => ok for v5 but not v6 (v6 with -m32 is ok), 
in both versions there are many fixes from the last century


PGP, le mal aimé, l'oublié, distancé par gpg opengpg gnupg etc
Du coup recompiler ce code du XXeme siècle n'a pas été joyeux,
surtout parce qu'en voyant les corrections, on voit l'esprit d'abandon et de laisser aller,
"pff, ces jeunes, ils changent tout tout le temps, ça marchait bien avant"
pgp est fait pour le 32 bits. (avec option 16bits?),

pgp658 fait trop d'erreurs ? essayons pgp50i-unix-src.tar.gz , le simplifié :
wha ! il reste des fautes de frappe dans le code !?!
comme si le code avait été abandonné du jour au lendemain.


PGP 5.0.i  : 3 fixes :

#* mauvais test sur la soixantequatrebitabilité (todo : better testing):
sed -i lib/pgp/include/pgpUsuals.h 's/ifndef HAVE64/ifndef DONTDOTHAT___HAVE64/'

#* pas de ';' dans les defines merci :
sed -i lib/pgp/keys/pgpRngRead.c 's/defined(WRAP_SUB);/defined(WRAP_SUB)/'

*relisez vous, manque un '\' dans le texte de licence :
sed -i apps/common/pgpFullLicense.c 's/Software Product\. $/Software Product.\\/'
(c'est peut être une astuce pour le relire?)

./configure --prefix=/somewhere ; make ;make install

Mais, la version 50i est très différente de la version 6, 
les options de ligne de commande ont rien à voir,
donc faut quand même faire la V6



PGP 6.5.8 , pgpsrc658unix.tar.gz : fixes

#* juste tenir compte de 64 bits
for f in `find . -name "config.sub"`;do
 sed \
  -e 's/i.3456.86 /i[3456]86 | x86_64 /' \
  -e 's/i.3456.86-\* /i[3456]86-* | x86_64-* /' \
  -i $f
done

#* correction de cast
sed -i libs/pfl/common/file/pgpStdFileIO.c -e 's/fpos_t/PGPFileOffset/g'

#* C++ est devenu plus formel, faut ajouter template <>
sed -i libs/pfl//common/classes/StPGPRefs.h \
 -e '/inline void .*::/ s/inline/template <> inline/'
sed -i ./libs/pgpcdk/priv/networklib/keyserver/CHTTPKeyServer.cpp \
 -e '/inline void .*::/ s/inline/template <> inline/'

#* correction de cast, ajout (char *) (car const char *)
sed -i ./libs/pgpcdk/priv/networklib/keyserver/CHTTPKeyServer.cpp \
 -e 's/p = strchr(kBase64Table, /p = (char *)strchr(kBase64Table, /'
sed -i ./libs/pgpcdk/priv/networklib/keyserver/CHTTPPGPKeyServer.cpp \
 -e 's/currentItem = strstr(inResult, "/currentItem = (char *)strstr(inResult, "/'

#* "writable-strings" : ça sent l'option bidouille de compil qui n'est plus admise
for f in `grep -rsl "fwritable-strings" *`;do
 sed -e 's/-fwritable-strings//' -i $f
done

#* les '?' dans un define font des trucs bizarres
sed -i ./libs/pgpcdk/pub/include/pgpUtilities.h \
    -e '/kPGPMacFileCreator_DecryptedBinary/ s/Binary.*$/Binary \"????\"/'

#* manque include malloc ?!
sed -i libs/pgpcdk/unix/ui/PGPKeyServerDialogs.cpp \
 -e 's/#include /#include \n#include /'

#* erreur dans le proto
sed -i clients/pgp/cmdline/prototypes.h \
 -e 's/^int cryptRandWriteFile/static int cryptRandWriteFile/' \
 -e 's/^int maintUpdate/static int maintUpdate/'

#* cast à l'envers
sed -i clients/pgp/cmdline/keymaint.c \
 -e 's/(PGPUInt32)traceValue = depth/traceValue = depth/'

#* no asm, on désactive l'assembleur pour la compil en 32 bits sur une archi 64 (galère)
for f in `grep -rsl "__asm__" *`;do
 sed -e 's/__GNUC__/__NOASM_EVENIFGNUC__/' -i $f
done

pour la compil, il faudra utiliser ldap.h fourni dans libs/network/ldaplib/include
et non pas celui du systeme

cd libs/pfl ;./configure ;make   #(ou configure --prefix=.... bref)
cd ../pgpcdk;./configure ; make headers ; make 
cd ../../clients/pgp/shared ; ./configure ; make ;
cd ../cmdline ; ./configure ; make 

en 64 bits ça compile mais ça affiche des erreurs à l'exécution :
je vais peut être laisser tomber moi aussi.
.... 3 jours après ... je laisse tomber le soixantequatrebitage,
compilation avec -m32 dans cppflags et ldflags
et les libs 32 bits :
glibc-2.12-1.47.el6.i686.rpm  libstdc++-4.4.6-3.el6.i686.rpm
libgcc-4.4.6-3.el6.i686.rpm   nss-softokn-freebl-3.12.9-11.el6.i686.rpm


mais toutes les modifs sont quand même conservées
pour pouvoir recompiler pgp avec les librairies récentes

cela génère un exécutable qui marche, mais qui s'autocritique par des assertions :
ASSERTION FAILED at pgpMemoryMgr.c line 423:
  PGPFreeData(): mgr being freed with outstanding allocations:
  (mgr->numAllocations == 0) not true
ou encore
ASSERTION FAILED at pflPrefs.c line 333:
  (( (err) == kPGPError_NoErr ) || err == kPGPError_UserAbort) not true



Aucun commentaire: