[openssl-users] crypto/objects/o_names.c problem with Solaris 10 and strict Oracle Studio 12.6 c99

Dennis Clarke dclarke at blastwave.org
Fri Jan 18 04:56:23 UTC 2019


On 1/17/19 8:25 PM, Michael Wojcik wrote:
>> From: openssl-users [mailto:openssl-users-bounces at openssl.org] On Behalf Of
>> Dennis Clarke
>> Sent: Thursday, January 17, 2019 18:23
>>
>> "crypto/objects/o_names.c", line 114: error: undefined symbol: strcasecmp
>> "crypto/objects/o_names.c", line 114: warning: improper pointer/integer
>> combination: op "="
>> "crypto/objects/o_names.c", line 151: warning: implicit function
>> declaration: strcasecmp
> 
> Note the issue here is an undefined symbol, which consequently has an implicit definition as an int with external linkage and static duration. So we're talking about a header problem, not a library problem.
> 
>> So would love to hear someones thoughts on why strcasecmp suddenly went
>> missing?
> 
> Well...
> 
> strcasecmp is a heresy. 

Love it.

I knew something like this was in the air and I could smell it :-)

<snip>
> 
> But of course the declaration of strcasecmp in strings.h is itself ifdeffed. 
To get it, _XPG4_2 must be defined, and __EXTENSIONS__ must NOT be defined.

Full moon black cat ifdeffery crud here we go.

> 
> My guess is you're falling foul of one of those two conditions, when you compile in strict mode.
> 
> The simplest fix would be to whack a declaration of strcasecmp into the source file itself

Yeah .. that's icky.

> but that's inelegant and hard to maintain - presumably you'd rather do something through the OpenSSL configure process. As for that, well... the only thing that comes to mind is something like:
> 
> 1. Add -Dstrcasecmp=cmpstrci to the compiler flags
> 2. Add -lcmpstrci to the link flags
> 3. Create a little libcmpstrci.a (no need for it to be a shared object) with a case-insensitive string comparison function named cmpstrci. It can use strcasecmp if it must, or you can implement your own.
> 
> Or the problem might be something else, of course, but the fact that strings.h does appear in the output but strcasecmp isn't declared does suggest the conditional-compilation in strings.h is to blame.
> 

Thank you for the great reply where clearly you have seen ifdeffery
nonsense bite you.  I get caught between a rock and a hrd place here
every time because if I try to go with just ordinary cc and just some
transition loosey goosey not-really-compliant or strict CFLAGS then I
arrive in a different ugly place :


${LDCMD:-/opt/developerstudio12.6/bin/cc} -m64 -xarch=sparc -g -Xa 
-errfmt=error -erroff=%none -errshort=full -xstrconst -xildoff 
-xmemalign=8s -xnolibmil -xcode=pic32 -xregs=no%appl -xlibmieee -mc 
-ftrap=%none -xbuiltin=%none -xunroll=1 -xstrconst -Xa -m64 -xarch=sparc 
-g -Xa -errfmt=error -erroff=%none -errshort=full -xstrconst -xildoff 
-xmemalign=8s -xnolibmil -xcode=pic32 -xregs=no%appl -xlibmieee -mc 
-ftrap=%none -xbuiltin=%none -xunroll=1 -L. -mt  \
         -o test/rsa_complex test/rsa_complex.o \
          -lsocket -lnsl -ldl -lrt -lpthread
Undefined                       first referenced
  symbol                             in file
OPENSSL_sk_pop_free                 test/rsa_complex.o
OPENSSL_sk_dup                      test/rsa_complex.o
OPENSSL_sk_pop                      test/rsa_complex.o
OPENSSL_sk_num                      test/rsa_complex.o
OPENSSL_sk_new                      test/rsa_complex.o
OPENSSL_sk_set                      test/rsa_complex.o
OPENSSL_sk_free                     test/rsa_complex.o
OPENSSL_sk_find                     test/rsa_complex.o
OPENSSL_sk_push                     test/rsa_complex.o
OPENSSL_sk_sort                     test/rsa_complex.o
OPENSSL_sk_zero                     test/rsa_complex.o
OPENSSL_sk_is_sorted                test/rsa_complex.o
OPENSSL_sk_shift                    test/rsa_complex.o
OPENSSL_sk_value                    test/rsa_complex.o
OPENSSL_sk_delete_ptr               test/rsa_complex.o
OPENSSL_sk_unshift                  test/rsa_complex.o
OPENSSL_sk_new_null                 test/rsa_complex.o
OPENSSL_sk_set_cmp_func             test/rsa_complex.o
OPENSSL_sk_reserve                  test/rsa_complex.o
OPENSSL_sk_new_reserve              test/rsa_complex.o
OPENSSL_sk_delete                   test/rsa_complex.o
OPENSSL_sk_insert                   test/rsa_complex.o
OPENSSL_sk_deep_copy                test/rsa_complex.o
OPENSSL_sk_find_ex                  test/rsa_complex.o
ld: fatal: symbol referencing errors. No output written to test/rsa_complex
gmake[1]: *** [Makefile:3561: test/rsa_complex] Error 2
gmake[1]: Leaving directory 
'/usr/local/build/openssl-1.1.1a_SunOS5.10_sparc64vii+.004'
gmake: *** [Makefile:169: all] Error 2

Looks like getting a debug non-optimized library will be a major pain.

Dennis


More information about the openssl-users mailing list