bitcoin-core / secp256k1

Optimized C library for EC operations on curve secp256k1
MIT License
2.06k stars 1k forks source link

Is default `-Wl,--no-undefined` desired? #1556

Open hebasto opened 3 months ago

hebasto commented 3 months ago

Consider the following diff:

--- a/src/secp256k1.c
+++ b/src/secp256k1.c
@@ -765,7 +765,9 @@ int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey
     return ret;
 }

+void undefined_function(void);
 int secp256k1_context_randomize(secp256k1_context* ctx, const unsigned char *seed32) {
+    undefined_function();
     VERIFY_CHECK(ctx != NULL);
     ARG_CHECK(secp256k1_context_is_proper(ctx));

It compiles fine:

$ ./autogen.sh
$ ./configure
$ make libsecp256k1.la

However, it should fail like that:

$ ./autogen.sh
$ ./configure LDFLAGS="-Wl,--no-undefined"
$ make libsecp256k1.la
  CC       src/libsecp256k1_la-secp256k1.lo
  CC       src/libsecp256k1_precomputed_la-precomputed_ecmult.lo
  CC       src/libsecp256k1_precomputed_la-precomputed_ecmult_gen.lo
  CCLD     libsecp256k1_precomputed.la
  CCLD     libsecp256k1.la
/usr/bin/ld: src/.libs/libsecp256k1_la-secp256k1.o: in function `secp256k1_context_randomize':
/home/hebasto/git/secp256k1/secp256k1/src/secp256k1.c:770:(.text+0xee01): undefined reference to `undefined_function'
collect2: error: ld returned 1 exit status
make: *** [Makefile:1020: libsecp256k1.la] Error 1
real-or-random commented 3 months ago

I think we want to check for undefined symbols, and -Wl,--no-undefined seems to be the canonical way of doing so.

I assume one important exception is builds with external default callbacks, so we can't enable it in these cases.