Can OpenSSL 3.1.0 be compiled without atomic.h ?
Dennis Clarke
dclarke at blastwave.org
Fri Apr 7 11:33:07 UTC 2023
On 3/31/23 03:58, Matt Caswell wrote:
>
.
.
.
>
> Hmmm. Most of the Solaris atomics code in the crypto/threads_pthread.c
> file seems to be conditioned on detecting Solaris 10 or 11:
>
Sure enough that is the case. In an old old machine running Solaris 8
one may find that __sun is defined by there is no such thing as
__SunOS_5_8. Not so far as I can detect.
#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
#if defined(__sun)
printf("Yes \"__sun\" is defined here.\n");
#endif
#if defined(__SunOS_5_8)
printf("Yes \"__SunOS_5_8\" is defined here.\n");
#endif
printf("Did anything work?\n");
return EXIT_SUCCESS;
}
nix$ /var/tmp/dclarke/foo
Yes "__sun" is defined here.
Did anything work?
nix$
If one were to find __sun but NOT Solaris 10 or Solaris 11 then there
does exist a strange /usr/include/sys/atomic.h which even has the nifty
looking :
extern uint32_t atomic_add_32_nv(uint32_t *target, int32_t delta);
That would almost fit the bill to perform the atomic delta addition.
However there is no libatomic.so anywhere in the system and I thought
that atomics were well into the C11 world anyways. So yes ... may as
well just walk past that #include <atomic.h> entirely :
> # elif defined(__sun) && (defined(__SunOS_5_10) || defined(__SunOS_5_11))
>
> But the include of atomics.h at the top of the file just looks like this:
>
> #if defined(__sun)
> # include <atomic.h>
> #endif
>
>
> My guess is modifying that include to have the same check for Solaris
> 10/11 as used elsewhere might force it through.
$ diff -u ./crypto/threads_pthread.c.orig ./crypto/threads_pthread.c
--- ./crypto/threads_pthread.c.orig 2023-03-14 12:59:07.000000000 +0000
+++ ./crypto/threads_pthread.c 2023-04-03 16:14:14.759595000 +0000
@@ -13,7 +13,7 @@
#include <openssl/crypto.h>
#include "internal/cryptlib.h"
-#if defined(__sun)
+#if defined(__sun) && (defined(__SunOS_5_10) || defined(__SunOS_5_11))
# include <atomic.h>
#endif
@@ -206,7 +206,7 @@
return 1;
}
# elif defined(__sun) && (defined(__SunOS_5_10) || defined(__SunOS_5_11))
- /* This will work for all future Solaris versions. */
+ /* This will work for some Solaris versions. */
if (ret != NULL) {
*ret = atomic_add_int_nv((volatile unsigned int *)val, amount);
return 1;
$
So then everything compiles. A whole bucket of tests fail and most of
them look like timeouts on this old old machine :
Test Summary Report
-------------------
80-test_ca.t (Wstat: 1280 (exited 5) Tests: 15
Failed: 5)
Failed tests: 7, 9-10, 12-13
Non-zero exit status: 5
80-test_cmp_http.t (Wstat: 1280 (exited 5) Tests: 6 Failed: 5)
Failed tests: 1-5
Non-zero exit status: 5
80-test_ssl_new.t (Wstat: 1280 (exited 5) Tests: 30
Failed: 5)
Failed tests: 4, 7, 11, 16, 18
Non-zero exit status: 5
Files=250, Tests=2920, 290455 wallclock secs (750.73 usr 26.64 sys +
285107.14 cusr 5006.51 csys = 290891.02 CPU)
Result: FAIL
gmake[1]: *** [Makefile:2448: run_tests] Error 1
gmake[1]: Leaving directory '/opt/bw/build/openssl-3.1.0_SunOS5.8_sun4m.002'
gmake: *** [Makefile:2444: tests] Error 2
So it may not be possible with any gcc from the last decade. Was worth a
try.
--
Dennis Clarke
RISC-V/SPARC/PPC/ARM/CISC
More information about the openssl-users
mailing list