The recommended workaround is to build custom versions of the values-X[act].o objects, so that gcc links every program against these instead of their original versions in /usr/lib. They contain an (admittedly nice) hack to jump over the zeroes (instead of NOPs) inserted by the SUN linker. I didn't like that. A broad workaround for an isolated problem... In fact, there are voices saying that this behaviour of Solaris ld is a feature, not a bug.
I prefer to patch openssl, like this:
diff -ur openssl-1.0.0c~/crypto/perlasm/x86gas.pl openssl-1.0.0c/crypto/perlasm/x86gas.pl
--- openssl-1.0.0c~/crypto/perlasm/x86gas.pl 2008-12-17 20:56:47.000000000 +0100
+++ openssl-1.0.0c/crypto/perlasm/x86gas.pl 2011-01-31 17:22:20.551210508 +0100
@@ -211,7 +211,6 @@
.section .init
call $f
jmp .Linitalign
-.align $align
.Linitalign:
___
}
I.e., simply remove the alignment at the end of the custom .init section in the assembler files (which are generated via a preprocessing script written in perl).