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