Integrate the new way of C++ symbol prefixing with CMake. Bug: 42220000 Change-Id: I00a9dc89ff5dc136e0ed4909a1c8e8366a6a6964 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/87030 Reviewed-by: Xiangfei Ding <xfding@google.com> Commit-Queue: Rudolf Polzer <rpolzer@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt index c37bd80..6917223 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -76,6 +76,10 @@ endforeach() if(BORINGSSL_PREFIX AND BORINGSSL_PREFIX_SYMBOLS) + if(FIPS AND NOT BUILD_SHARED_LIBS) + # Symbol prefixing is currently incompatible with delocate. + message(FATAL_ERROR "Cannot use BORINGSSL_PREFIX with FIPS and static libraries") + endif() require_go() add_definitions(-DBORINGSSL_PREFIX=${BORINGSSL_PREFIX}) # CMake automatically connects include_directories to the NASM command-line,
diff --git a/gen/sources.bzl b/gen/sources.bzl index 3eb86d2..b0346cb 100644 --- a/gen/sources.bzl +++ b/gen/sources.bzl
@@ -686,6 +686,7 @@ "crypto/spake2plus/internal.h", "crypto/trust_token/internal.h", "crypto/x509/internal.h", + "include/openssl/prefix_symbols.h", "third_party/fiat/bedrock_unverified_bareminimum.c.inc", "third_party/fiat/bedrock_unverified_platform.c.inc", "third_party/fiat/curve25519_32.h",
diff --git a/gen/sources.cmake b/gen/sources.cmake index 2353b0a..d862eef 100644 --- a/gen/sources.cmake +++ b/gen/sources.cmake
@@ -708,6 +708,7 @@ crypto/spake2plus/internal.h crypto/trust_token/internal.h crypto/x509/internal.h + include/openssl/prefix_symbols.h third_party/fiat/bedrock_unverified_bareminimum.c.inc third_party/fiat/bedrock_unverified_platform.c.inc third_party/fiat/curve25519_32.h
diff --git a/gen/sources.gni b/gen/sources.gni index 21af335..56ca0c8 100644 --- a/gen/sources.gni +++ b/gen/sources.gni
@@ -686,6 +686,7 @@ "crypto/spake2plus/internal.h", "crypto/trust_token/internal.h", "crypto/x509/internal.h", + "include/openssl/prefix_symbols.h", "third_party/fiat/bedrock_unverified_bareminimum.c.inc", "third_party/fiat/bedrock_unverified_platform.c.inc", "third_party/fiat/curve25519_32.h",
diff --git a/gen/sources.json b/gen/sources.json index 6b24ac8..dad4298 100644 --- a/gen/sources.json +++ b/gen/sources.json
@@ -668,6 +668,7 @@ "crypto/spake2plus/internal.h", "crypto/trust_token/internal.h", "crypto/x509/internal.h", + "include/openssl/prefix_symbols.h", "third_party/fiat/bedrock_unverified_bareminimum.c.inc", "third_party/fiat/bedrock_unverified_platform.c.inc", "third_party/fiat/curve25519_32.h",
diff --git a/gen/sources.mk b/gen/sources.mk index 94d51b7..0d1d104 100644 --- a/gen/sources.mk +++ b/gen/sources.mk
@@ -676,6 +676,7 @@ crypto/spake2plus/internal.h \ crypto/trust_token/internal.h \ crypto/x509/internal.h \ + include/openssl/prefix_symbols.h \ third_party/fiat/bedrock_unverified_bareminimum.c.inc \ third_party/fiat/bedrock_unverified_platform.c.inc \ third_party/fiat/curve25519_32.h \
diff --git a/include/openssl/base.h b/include/openssl/base.h index 1d050c7..36b9051 100644 --- a/include/openssl/base.h +++ b/include/openssl/base.h
@@ -42,8 +42,8 @@ #include <openssl/target.h> // IWYU pragma: export #if defined(BORINGSSL_PREFIX) -#include <boringssl_prefix_symbols.h> -#endif +#include <openssl/prefix_symbols.h> +#endif // BORINGSSL_PREFIX #if defined(__cplusplus) extern "C" {
diff --git a/gen/boringssl_prefix_symbols_c.inc b/include/openssl/prefix_symbols.h similarity index 98% rename from gen/boringssl_prefix_symbols_c.inc rename to include/openssl/prefix_symbols.h index 3236487..8b70e0a 100644 --- a/gen/boringssl_prefix_symbols_c.inc +++ b/include/openssl/prefix_symbols.h
@@ -14,6 +14,22 @@ // Generated by go ./util/pregenerate. Do not edit manually. +#ifndef OPENSSL_HEADER_PREFIX_SYMBOLS_H +#define OPENSSL_HEADER_PREFIX_SYMBOLS_H + + +#define BORINGSSL_ADD_PREFIX_CONCAT_INNER(a, b) a##_##b +#define BORINGSSL_ADD_PREFIX_CONCAT(a, b) \ + BORINGSSL_ADD_PREFIX_CONCAT_INNER(a, b) +#define BORINGSSL_ADD_PREFIX(s) BORINGSSL_ADD_PREFIX_CONCAT(BORINGSSL_PREFIX, s) + +#if defined(__APPLE__) +#define BORINGSSL_SYMBOL_INNER(s) _##s +#define BORINGSSL_SYMBOL(s) BORINGSSL_SYMBOL_INNER(s) +#else // __APPLE__ +#define BORINGSSL_SYMBOL(s) s +#endif // __APPLE__ + #if defined(__PRAGMA_REDEFINE_EXTNAME) #pragma redefine_extname ACCESS_DESCRIPTION_free BORINGSSL_SYMBOL(BORINGSSL_ADD_PREFIX(ACCESS_DESCRIPTION_free)) @@ -6887,3 +6903,5 @@ #define sk_void_sort BORINGSSL_ADD_PREFIX(sk_void_sort) #define sk_void_value BORINGSSL_ADD_PREFIX(sk_void_value) #define sk_void_zero BORINGSSL_ADD_PREFIX(sk_void_zero) + +#endif // OPENSSL_HEADER_PREFIX_SYMBOLS_H
diff --git a/util/make_prefix_headers.go b/util/make_prefix_headers.go index 7cfc48b..8e1e05c 100644 --- a/util/make_prefix_headers.go +++ b/util/make_prefix_headers.go
@@ -215,11 +215,6 @@ os.Exit(1) } - if err := writeCHeader(symbols, filepath.Join(*out, "boringssl_prefix_symbols.h")); err != nil { - fmt.Fprintf(os.Stderr, "Error writing boringssl_prefix_symbols.h: %s\n", err) - os.Exit(1) - } - if err := writeASMHeader(symbols, filepath.Join(*out, "boringssl_prefix_symbols_asm.h")); err != nil { fmt.Fprintf(os.Stderr, "Error writing boringssl_prefix_symbols_asm.h: %s\n", err) os.Exit(1)
diff --git a/util/pregenerate/build.go b/util/pregenerate/build.go index 5853a29..fd829b6 100644 --- a/util/pregenerate/build.go +++ b/util/pregenerate/build.go
@@ -329,6 +329,14 @@ } } +// addGeneratedHeader adds a generated `header` to `targetsOut`. +func addGeneratedHeader(targetsOut map[string]build.Target, header string) { + target := targetsOut["crypto"] + target.InternalHdrs = append(target.InternalHdrs, header) + slices.Sort(target.InternalHdrs) + targetsOut["crypto"] = target +} + // Construct a task to collect assembly global symbols into the file "gen/asm.syms". // This task should only run after all the `PerlAsmTask`s in `perlAsmTasks` complete. func MakeCollectAsmGlobalTasks(perlAsmTasks []*Task, allAsmSrcs []string) []*Task { @@ -359,14 +367,15 @@ } // MakePrefixingIncludes returns the tasks to generate the header files for symbol prefixing. -func MakePrefixingIncludes(in map[string]InputTarget) []*Task { +func MakePrefixingIncludes(in map[string]InputTarget, targetsOut map[string]build.Target) []*Task { var headers []string for _, t := range in { headers = append(headers, t.Hdrs...) } + addGeneratedHeader(targetsOut, "include/openssl/prefix_symbols.h") return []*Task{ - NewSimpleTask("gen/boringssl_prefix_symbols_c.inc", func() ([]byte, error) { - return BuildCRenamingIncludes(headers) + NewSimpleTask("include/openssl/prefix_symbols.h", func() ([]byte, error) { + return BuildCRenamingHeader(headers) }), } }
diff --git a/util/pregenerate/idextractor.go b/util/pregenerate/idextractor.go index e844d9b..c1086d8 100644 --- a/util/pregenerate/idextractor.go +++ b/util/pregenerate/idextractor.go
@@ -52,10 +52,10 @@ return strings.TrimSuffix(strings.ToLower(filepath.Base(clang)), ".exe") == "clang-cl", nil } -// BuildCRenamingMacros calls Clang to extract the AST of the headers, then processes them to extract the symbols. +// BuildCRenamingHeader calls Clang to extract the AST of the headers, then processes them to extract the symbols. // // It returns an include for C. -func BuildCRenamingIncludes(headers []string) (cInclude []byte, err error) { +func BuildCRenamingHeader(headers []string) (cInclude []byte, err error) { cmd := *clangPath if cmd == "" { return nil, fmt.Errorf("%w: clang has been disabled by flag", TaskSkipped) @@ -198,7 +198,24 @@ var cOutput bytes.Buffer writeHeader(&cOutput, "//") - cOutput.WriteString("\n") + cOutput.WriteString(` +#ifndef OPENSSL_HEADER_PREFIX_SYMBOLS_H +#define OPENSSL_HEADER_PREFIX_SYMBOLS_H + + +#define BORINGSSL_ADD_PREFIX_CONCAT_INNER(a, b) a##_##b +#define BORINGSSL_ADD_PREFIX_CONCAT(a, b) \ + BORINGSSL_ADD_PREFIX_CONCAT_INNER(a, b) +#define BORINGSSL_ADD_PREFIX(s) BORINGSSL_ADD_PREFIX_CONCAT(BORINGSSL_PREFIX, s) + +#if defined(__APPLE__) +#define BORINGSSL_SYMBOL_INNER(s) _##s +#define BORINGSSL_SYMBOL(s) BORINGSSL_SYMBOL_INNER(s) +#else // __APPLE__ +#define BORINGSSL_SYMBOL(s) s +#endif // __APPLE__ + +`) cOutput.WriteString("#if defined(__PRAGMA_REDEFINE_EXTNAME)\n") cOutput.WriteString("\n") for _, sym := range slices.Sorted(maps.Keys(viaRedefineExtname)) { @@ -216,5 +233,8 @@ for _, sym := range slices.Sorted(maps.Keys(viaMacro)) { fmt.Fprintf(&cOutput, "#define %s BORINGSSL_ADD_PREFIX(%s)\n", sym, sym) } + cOutput.WriteString(` +#endif // OPENSSL_HEADER_PREFIX_SYMBOLS_H +`) return cOutput.Bytes(), nil }
diff --git a/util/pregenerate/pregenerate.go b/util/pregenerate/pregenerate.go index 4f558e8..969426a 100644 --- a/util/pregenerate/pregenerate.go +++ b/util/pregenerate/pregenerate.go
@@ -178,7 +178,7 @@ allAsmSrcs = append(allAsmSrcs, targetAsmSrcs...) } - tasks = append(tasks, MakePrefixingIncludes(targetsIn)...) + tasks = append(tasks, MakePrefixingIncludes(targetsIn, targetsOut)...) tasks = append(tasks, MakeBuildFiles(targetsOut)...) tasks = append(tasks, MakeCollectAsmGlobalTasks(perlAsmTasks, allAsmSrcs)...) tasks = append(tasks, NewSimpleTask("gen/README.md", func() ([]byte, error) {