GNU bug report logs -
#73190
[PATCH 0/3] gnu: dyninst: Update to 13.0.0.
Previous Next
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 73190 in the body.
You can then email your comments to 73190 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
guix-patches <at> gnu.org
:
bug#73190
; Package
guix-patches
.
(Thu, 12 Sep 2024 02:27:02 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Nguyễn Gia Phong <mcsinyx <at> disroot.org>
:
New bug report received and forwarded. Copy sent to
guix-patches <at> gnu.org
.
(Thu, 12 Sep 2024 02:27:02 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
The currently included Dyninst 10.2.1 recently failed to build
due to stricter include lookup (dataflowAPI/src/AbslocInterface.C
missing std::deque).
Since no package depends on Dyninst, let's just upgrade it
to the latest version 13.0.0 instead of adding more patches.
This new version depends on GCC internal library iberty
with an additional header demangle.h.
I referenced the Debian package and it does seem to include this header:
https://packages.debian.org/sid/amd64/libiberty-dev/filelist
I wonder if we should also put iberty headers under a libiberty/
namespace though.
(Speaking of header namespacing, I am not happy with how Dyninst lay out
generically named headers, e.g. Command.h, Event.h, Graph.h, etc.
directly under include/. I suppose it is not particularly an issue
for Guix thanks to declarative build.)
Dyninst is built with PIC, so the same must be done
for the statically linked libiberty. Debian is doing the same
so I suppose it should not affect other dependees.
Nguyễn Gia Phong (3):
gnu: make-libiberty: Install the header demangle.h.
gnu: make-libiberty: Build with -fPIC.
gnu: dyninst: Update to 13.0.0.
gnu/local.mk | 1 -
gnu/packages/gcc.scm | 3 ++
gnu/packages/instrumentation.scm | 17 +++++-----
.../dyninst-fix-glibc-compatibility.patch | 33 -------------------
4 files changed, 11 insertions(+), 43 deletions(-)
delete mode 100644 gnu/packages/patches/dyninst-fix-glibc-compatibility.patch
base-commit: b6d5a7f5836739dab884b49a64ca354794dd845f
--
2.46.0
Information forwarded
to
andreas <at> enge.fr, ludo <at> gnu.org, guix-patches <at> gnu.org
:
bug#73190
; Package
guix-patches
.
(Thu, 12 Sep 2024 02:30:02 GMT)
Full text and
rfc822 format available.
Message #8 received at 73190 <at> debbugs.gnu.org (full text, mbox):
This header is wanted by Dyninst.
* gnu/packages/gcc.scm (make-libiberty):
Add include/demangle.h to install phase.
Change-Id: I01235071b75b412f55785d240cda248315b7a93e
---
gnu/packages/gcc.scm | 2 ++
1 file changed, 2 insertions(+)
diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm
index 2f90024295b2..fef05b0c32d6 100644
--- a/gnu/packages/gcc.scm
+++ b/gnu/packages/gcc.scm
@@ -16,6 +16,7 @@
;;; Copyright © 2024 Zheng Junjie <873216071 <at> qq.com>
;;; Copyright © 2023 Bruno Victal <mirai <at> makinata.eu>
;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer <at> gmail.com>
+;;; Copyright © 2024 Nguyễn Gia Phong <mcsinyx <at> disroot.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -1074,6 +1075,7 @@ (define (make-libiberty gcc)
(lib (string-append out "/lib/"))
(include (string-append out "/include/")))
(install-file "libiberty.a" lib)
+ (install-file "../include/demangle.h" include)
(install-file "../include/libiberty.h" include)))))))
(inputs '())
(outputs '("out"))
--
2.46.0
Information forwarded
to
andreas <at> enge.fr, ludo <at> gnu.org, guix-patches <at> gnu.org
:
bug#73190
; Package
guix-patches
.
(Thu, 12 Sep 2024 02:30:02 GMT)
Full text and
rfc822 format available.
Message #11 received at 73190 <at> debbugs.gnu.org (full text, mbox):
Since iberty is a static library, linking a PIC-enabled target to it
requires it to also have been built with PIC. (The target is Dyninst
in this case.)
* gnu/packages/gcc.scm (make-libiberty)[arguments]:
Adjust make-flags to add -fPIC to CFLAGS.
Change-Id: I155045d05f4434cb68be933a95b7bc9fdec98818
---
gnu/packages/gcc.scm | 1 +
1 file changed, 1 insertion(+)
diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm
index fef05b0c32d6..9da2d629cce7 100644
--- a/gnu/packages/gcc.scm
+++ b/gnu/packages/gcc.scm
@@ -1064,6 +1064,7 @@ (define (make-libiberty gcc)
(name "libiberty")
(arguments
`(#:out-of-source? #t
+ #:make-flags '("CFLAGS=-fPIC")
#:phases
(modify-phases %standard-phases
(add-before 'configure 'chdir
--
2.46.0
Information forwarded
to
guix-patches <at> gnu.org
:
bug#73190
; Package
guix-patches
.
(Thu, 12 Sep 2024 02:30:03 GMT)
Full text and
rfc822 format available.
Message #14 received at 73190 <at> debbugs.gnu.org (full text, mbox):
* gnu/packages/instrumentations.scm (dyninst): Update to 13.0.0.
[propagated-inputs]: Add libiberty.
* gnu/packages/patches/dyninst-fix-glibc-compatibility.patch:
Remove file.
Change-Id: I6e5dfa9d698de4d45614c535b5dd5cdaad239425
---
gnu/local.mk | 1 -
gnu/packages/instrumentation.scm | 17 +++++-----
.../dyninst-fix-glibc-compatibility.patch | 33 -------------------
3 files changed, 8 insertions(+), 43 deletions(-)
delete mode 100644 gnu/packages/patches/dyninst-fix-glibc-compatibility.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index ed630041ff95..2485b4ab1669 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1160,7 +1160,6 @@ dist_patch_DATA = \
%D%/packages/patches/dvd+rw-tools-add-include.patch \
%D%/packages/patches/dwarves-threading-reproducibility.patch \
%D%/packages/patches/dynaconf-unvendor-deps.patch \
- %D%/packages/patches/dyninst-fix-glibc-compatibility.patch \
%D%/packages/patches/efivar-211.patch \
%D%/packages/patches/eigen-fix-strict-aliasing-bug.patch \
%D%/packages/patches/einstein-build.patch \
diff --git a/gnu/packages/instrumentation.scm b/gnu/packages/instrumentation.scm
index f8bc2702bc37..0cc9a3a8d751 100644
--- a/gnu/packages/instrumentation.scm
+++ b/gnu/packages/instrumentation.scm
@@ -2,6 +2,7 @@
;;; Copyright © 2021, 2022 Olivier Dion <olivier.dion <at> polymtl.ca>
;;; Copyright © 2023 Andy Tai <atai <at> atai.org>
;;; Copyright © 2023 Marius Bakke <marius <at> gnu.org>
+;;; Copyright © 2024 Nguyễn Gia Phong <mcsinyx <at> disroot.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -35,6 +36,7 @@ (define-module (gnu packages instrumentation)
#:use-module (gnu packages file)
#:use-module (gnu packages flex)
#:use-module (gnu packages gawk)
+ #:use-module (gnu packages gcc)
#:use-module (gnu packages glib)
#:use-module (gnu packages guile)
#:use-module (gnu packages haskell-xyz)
@@ -202,9 +204,7 @@ (define-public barectf
(define-public dyninst
(package
(name "dyninst")
- ;; Newer versions are not promoted on main home page.
- ;; Upgrade to 12.0.1 if anyone require a newer version.
- (version "10.2.1")
+ (version "13.0.0")
(source (origin
(method git-fetch)
(uri (git-reference
@@ -212,9 +212,8 @@ (define-public dyninst
(commit (string-append "v" version))))
(file-name (git-file-name name version))
(sha256
- (base32 "1m04pg824rqx647wvk9xl33ri8i6mm0vmrz9924li25dxbr4zqd5"))
- (patches
- (search-patches "dyninst-fix-glibc-compatibility.patch"))))
+ (base32
+ "0vkd9z6zwvn13ynfys2fg5yanv7n9pl7x5z8m1lcnmnb0kwgi035"))))
(build-system cmake-build-system)
(arguments
@@ -238,10 +237,10 @@ (define-public dyninst
(add-after 'unpack 'patch-bad-logic
(lambda _
(substitute* "dyninstAPI/src/linux.C"
- (("if\\(\\!fgets\\(buffer, 512, ldconfig\\)\\)")
- "fgets(buffer, 512, ldconfig); if (false)")))))))
+ (("if\\(fgets\\(buffer, buffer_size, ldconfig\\)\\)")
+ "fgets(buffer, buffer_size, ldconfig); if (true)")))))))
(propagated-inputs
- (list elfutils boost tbb-2020))
+ (list elfutils libiberty boost tbb))
(home-page "https://dyninst.org/")
(synopsis "Dynamic instrumentation")
(description "Dyninst is a collection of libraries for instrumenting,
diff --git a/gnu/packages/patches/dyninst-fix-glibc-compatibility.patch b/gnu/packages/patches/dyninst-fix-glibc-compatibility.patch
deleted file mode 100644
index cd018da6cce1..000000000000
--- a/gnu/packages/patches/dyninst-fix-glibc-compatibility.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From f233c46ac7b415104d04e4bb74bd7a0fcf24a333 Mon Sep 17 00:00:00 2001
-From: Olivier Dion <odion <at> efficios.com>
-Date: Thu, 15 Jun 2023 12:02:08 -0400
-Subject: [PATCH] Fix compatibility with glibc 2.35
-
-Something has change with the visibility of the _r_debug structure in
-glibc 2.35. See this issue
-<https://github.com/dyninst/dyninst/issues/1282>.
-
-This patch is essentially the upstream fix
-<https://github.com/dyninst/dyninst/commit/273803a4c643ed3506f9a69c6ec71d5ab337489c>
-backported.
-
-Signed-off-by: Olivier Dion <odion <at> efficios.com>
----
- dyninstAPI_RT/src/RTlinux.c | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/dyninstAPI_RT/src/RTlinux.c b/dyninstAPI_RT/src/RTlinux.c
-index fc231d0a4..2f17ff677 100644
---- a/dyninstAPI_RT/src/RTlinux.c
-+++ b/dyninstAPI_RT/src/RTlinux.c
-@@ -406,7 +406,6 @@ void dyninstTrapHandler(int sig, siginfo_t *sg, ucontext_t *context)
- #if defined(cap_binary_rewriter)
-
- extern struct r_debug _r_debug;
--DLLEXPORT struct r_debug _r_debug __attribute__ ((weak));
-
- /* Verify that the r_debug variable is visible */
- void r_debugCheck() { assert(_r_debug.r_map); }
---
-2.40.1
-
--
2.46.0
Information forwarded
to
guix-patches <at> gnu.org
:
bug#73190
; Package
guix-patches
.
(Thu, 12 Sep 2024 17:01:02 GMT)
Full text and
rfc822 format available.
Message #17 received at 73190 <at> debbugs.gnu.org (full text, mbox):
Hello,
Nguyễn Gia Phong <mcsinyx <at> disroot.org> skribis:
> Since iberty is a static library, linking a PIC-enabled target to it
> requires it to also have been built with PIC. (The target is Dyninst
> in this case.)
>
> * gnu/packages/gcc.scm (make-libiberty)[arguments]:
> Adjust make-flags to add -fPIC to CFLAGS.
>
> Change-Id: I155045d05f4434cb68be933a95b7bc9fdec98818
[...]
> + #:make-flags '("CFLAGS=-fPIC")
I believe this overrides the default ‘CFLAGS’, and the end result is
that the library would be compiled with ‘-O0 -g0’.
So unless I’m mistaken, you should instead have:
"CFLAGS=-O2 -g -fPIC"
Apart from that, the patch series looks good to me.
Could you send updated patches?
Thanks in advance,
Ludo’.
Information forwarded
to
andreas <at> enge.fr, ludo <at> gnu.org, guix-patches <at> gnu.org
:
bug#73190
; Package
guix-patches
.
(Thu, 19 Sep 2024 07:41:01 GMT)
Full text and
rfc822 format available.
Message #20 received at 73190 <at> debbugs.gnu.org (full text, mbox):
This header is wanted by Dyninst.
* gnu/packages/gcc.scm (make-libiberty):
Add include/demangle.h to install phase.
Change-Id: I01235071b75b412f55785d240cda248315b7a93e
---
This patch is identical as v1.
gnu/packages/gcc.scm | 2 ++
1 file changed, 2 insertions(+)
diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm
index 9ec4a3a68785..164c8d782ca3 100644
--- a/gnu/packages/gcc.scm
+++ b/gnu/packages/gcc.scm
@@ -16,6 +16,7 @@
;;; Copyright © 2024 Zheng Junjie <873216071 <at> qq.com>
;;; Copyright © 2023 Bruno Victal <mirai <at> makinata.eu>
;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer <at> gmail.com>
+;;; Copyright © 2024 Nguyễn Gia Phong <mcsinyx <at> disroot.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -1075,6 +1076,7 @@ (define (make-libiberty gcc)
(lib (string-append out "/lib/"))
(include (string-append out "/include/")))
(install-file "libiberty.a" lib)
+ (install-file "../include/demangle.h" include)
(install-file "../include/libiberty.h" include)))))))
(inputs '())
(outputs '("out"))
base-commit: 610b395424c02274800d85585cb542ad66d9afea
--
2.46.0
Information forwarded
to
andreas <at> enge.fr, ludo <at> gnu.org, guix-patches <at> gnu.org
:
bug#73190
; Package
guix-patches
.
(Thu, 19 Sep 2024 07:41:02 GMT)
Full text and
rfc822 format available.
Message #23 received at 73190 <at> debbugs.gnu.org (full text, mbox):
Since iberty is a static library, linking a PIC-enabled target to it
requires it to also have been built with PIC. (The target is Dyninst
in this case.)
This `-fPIC' flag is appended to the default CFLAGS of `-O2 -g'.
* gnu/packages/gcc.scm (make-libiberty)[arguments]:
Adjust make-flags to add -fPIC to CFLAGS.
Change-Id: I155045d05f4434cb68be933a95b7bc9fdec98818
---
gnu/packages/gcc.scm | 1 +
1 file changed, 1 insertion(+)
diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm
index 164c8d782ca3..7fceb4be963f 100644
--- a/gnu/packages/gcc.scm
+++ b/gnu/packages/gcc.scm
@@ -1065,6 +1065,7 @@ (define (make-libiberty gcc)
(name "libiberty")
(arguments
`(#:out-of-source? #t
+ #:make-flags '("CFLAGS=-O2 -g -fPIC")
#:phases
(modify-phases %standard-phases
(add-before 'configure 'chdir
--
2.46.0
Information forwarded
to
guix-patches <at> gnu.org
:
bug#73190
; Package
guix-patches
.
(Thu, 19 Sep 2024 07:42:01 GMT)
Full text and
rfc822 format available.
Message #26 received at 73190 <at> debbugs.gnu.org (full text, mbox):
* gnu/packages/instrumentations.scm (dyninst): Update to 13.0.0.
[propagated-inputs]: Add libiberty.
* gnu/packages/patches/dyninst-fix-glibc-compatibility.patch:
Remove file.
Change-Id: I6e5dfa9d698de4d45614c535b5dd5cdaad239425
---
This patch is identical as v1.
gnu/local.mk | 1 -
gnu/packages/instrumentation.scm | 17 +++++-----
.../dyninst-fix-glibc-compatibility.patch | 33 -------------------
3 files changed, 8 insertions(+), 43 deletions(-)
delete mode 100644 gnu/packages/patches/dyninst-fix-glibc-compatibility.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index bdc740ead6d2..3435b7850eb3 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1160,7 +1160,6 @@ dist_patch_DATA = \
%D%/packages/patches/dvd+rw-tools-add-include.patch \
%D%/packages/patches/dwarves-threading-reproducibility.patch \
%D%/packages/patches/dynaconf-unvendor-deps.patch \
- %D%/packages/patches/dyninst-fix-glibc-compatibility.patch \
%D%/packages/patches/efivar-211.patch \
%D%/packages/patches/eigen-fix-strict-aliasing-bug.patch \
%D%/packages/patches/einstein-build.patch \
diff --git a/gnu/packages/instrumentation.scm b/gnu/packages/instrumentation.scm
index f8bc2702bc37..0cc9a3a8d751 100644
--- a/gnu/packages/instrumentation.scm
+++ b/gnu/packages/instrumentation.scm
@@ -2,6 +2,7 @@
;;; Copyright © 2021, 2022 Olivier Dion <olivier.dion <at> polymtl.ca>
;;; Copyright © 2023 Andy Tai <atai <at> atai.org>
;;; Copyright © 2023 Marius Bakke <marius <at> gnu.org>
+;;; Copyright © 2024 Nguyễn Gia Phong <mcsinyx <at> disroot.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -35,6 +36,7 @@ (define-module (gnu packages instrumentation)
#:use-module (gnu packages file)
#:use-module (gnu packages flex)
#:use-module (gnu packages gawk)
+ #:use-module (gnu packages gcc)
#:use-module (gnu packages glib)
#:use-module (gnu packages guile)
#:use-module (gnu packages haskell-xyz)
@@ -202,9 +204,7 @@ (define-public barectf
(define-public dyninst
(package
(name "dyninst")
- ;; Newer versions are not promoted on main home page.
- ;; Upgrade to 12.0.1 if anyone require a newer version.
- (version "10.2.1")
+ (version "13.0.0")
(source (origin
(method git-fetch)
(uri (git-reference
@@ -212,9 +212,8 @@ (define-public dyninst
(commit (string-append "v" version))))
(file-name (git-file-name name version))
(sha256
- (base32 "1m04pg824rqx647wvk9xl33ri8i6mm0vmrz9924li25dxbr4zqd5"))
- (patches
- (search-patches "dyninst-fix-glibc-compatibility.patch"))))
+ (base32
+ "0vkd9z6zwvn13ynfys2fg5yanv7n9pl7x5z8m1lcnmnb0kwgi035"))))
(build-system cmake-build-system)
(arguments
@@ -238,10 +237,10 @@ (define-public dyninst
(add-after 'unpack 'patch-bad-logic
(lambda _
(substitute* "dyninstAPI/src/linux.C"
- (("if\\(\\!fgets\\(buffer, 512, ldconfig\\)\\)")
- "fgets(buffer, 512, ldconfig); if (false)")))))))
+ (("if\\(fgets\\(buffer, buffer_size, ldconfig\\)\\)")
+ "fgets(buffer, buffer_size, ldconfig); if (true)")))))))
(propagated-inputs
- (list elfutils boost tbb-2020))
+ (list elfutils libiberty boost tbb))
(home-page "https://dyninst.org/")
(synopsis "Dynamic instrumentation")
(description "Dyninst is a collection of libraries for instrumenting,
diff --git a/gnu/packages/patches/dyninst-fix-glibc-compatibility.patch b/gnu/packages/patches/dyninst-fix-glibc-compatibility.patch
deleted file mode 100644
index cd018da6cce1..000000000000
--- a/gnu/packages/patches/dyninst-fix-glibc-compatibility.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From f233c46ac7b415104d04e4bb74bd7a0fcf24a333 Mon Sep 17 00:00:00 2001
-From: Olivier Dion <odion <at> efficios.com>
-Date: Thu, 15 Jun 2023 12:02:08 -0400
-Subject: [PATCH] Fix compatibility with glibc 2.35
-
-Something has change with the visibility of the _r_debug structure in
-glibc 2.35. See this issue
-<https://github.com/dyninst/dyninst/issues/1282>.
-
-This patch is essentially the upstream fix
-<https://github.com/dyninst/dyninst/commit/273803a4c643ed3506f9a69c6ec71d5ab337489c>
-backported.
-
-Signed-off-by: Olivier Dion <odion <at> efficios.com>
----
- dyninstAPI_RT/src/RTlinux.c | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/dyninstAPI_RT/src/RTlinux.c b/dyninstAPI_RT/src/RTlinux.c
-index fc231d0a4..2f17ff677 100644
---- a/dyninstAPI_RT/src/RTlinux.c
-+++ b/dyninstAPI_RT/src/RTlinux.c
-@@ -406,7 +406,6 @@ void dyninstTrapHandler(int sig, siginfo_t *sg, ucontext_t *context)
- #if defined(cap_binary_rewriter)
-
- extern struct r_debug _r_debug;
--DLLEXPORT struct r_debug _r_debug __attribute__ ((weak));
-
- /* Verify that the r_debug variable is visible */
- void r_debugCheck() { assert(_r_debug.r_map); }
---
-2.40.1
-
--
2.46.0
Reply sent
to
Ludovic Courtès <ludo <at> gnu.org>
:
You have taken responsibility.
(Thu, 19 Sep 2024 12:58:02 GMT)
Full text and
rfc822 format available.
Notification sent
to
Nguyễn Gia Phong <mcsinyx <at> disroot.org>
:
bug acknowledged by developer.
(Thu, 19 Sep 2024 12:58:02 GMT)
Full text and
rfc822 format available.
Message #31 received at 73190-done <at> debbugs.gnu.org (full text, mbox):
Hi,
Nguyễn Gia Phong <mcsinyx <at> disroot.org> skribis:
> * gnu/packages/instrumentations.scm (dyninst): Update to 13.0.0.
> [propagated-inputs]: Add libiberty.
> * gnu/packages/patches/dyninst-fix-glibc-compatibility.patch:
> Remove file.
>
> Change-Id: I6e5dfa9d698de4d45614c535b5dd5cdaad239425
Pushed as 254c8f2c8cbb47903682b026deac1fd07c48f919.
I followed up with e85f52e826b0701c3dcf9acf9d81e5ae57aec8f9, which fixes
i686-linux and adds a ‘supported-systems’ field.
Ludo’.
Information forwarded
to
guix-patches <at> gnu.org
:
bug#73190
; Package
guix-patches
.
(Fri, 20 Sep 2024 00:45:02 GMT)
Full text and
rfc822 format available.
Message #34 received at 73190 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
On 2024-09-19 at 14:56+02:00, Ludovic Courtès wrote:
> Nguyễn Gia Phong <mcsinyx <at> disroot.org> skribis:
> > * gnu/packages/instrumentations.scm (dyninst): Update to 13.0.0.
> > [propagated-inputs]: Add libiberty.
> > * gnu/packages/patches/dyninst-fix-glibc-compatibility.patch:
> > Remove file.
> >
> > Change-Id: I6e5dfa9d698de4d45614c535b5dd5cdaad239425
>
> Pushed as 254c8f2c8cbb47903682b026deac1fd07c48f919.
>
> I followed up with e85f52e826b0701c3dcf9acf9d81e5ae57aec8f9, which fixes
> i686-linux and adds a ‘supported-systems’ field.
Thank you!
[signature.asc (application/pgp-signature, inline)]
bug archived.
Request was from
Debbugs Internal Request <help-debbugs <at> gnu.org>
to
internal_control <at> debbugs.gnu.org
.
(Fri, 18 Oct 2024 11:24:10 GMT)
Full text and
rfc822 format available.
This bug report was last modified 240 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.