From 8a6210726063500022c7a515017ff444868546d4 Mon Sep 17 00:00:00 2001 From: Alexandre Lissy Date: Tue, 4 Jun 2024 18:29:13 +0000 Subject: [PATCH] Bug 1876590 - Place gToolkitBuildID in a specific section r=firefox-build-system-reviewers,nalexander,glandium For ELF we directly create a section with the value inside it Differential Revision: https://phabricator.services.mozilla.com/D199658 --- toolkit/library/buildid_section.h | 15 ++++++ toolkit/library/gen_buildid.py | 77 +++++++++++++++++++++++++++++-- toolkit/library/moz.build | 4 ++ 3 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 toolkit/library/buildid_section.h diff --git a/toolkit/library/buildid_section.h b/toolkit/library/buildid_section.h new file mode 100644 index 000000000000..aded58973281 --- /dev/null +++ b/toolkit/library/buildid_section.h @@ -0,0 +1,15 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZ_BUILDID_SECTION_NAME + +#if defined(XP_DARWIN) +# define MOZ_BUILDID_SECTION_NAME "__DATA,mozbuildid" +#elif defined(XP_WIN) +# define MOZ_BUILDID_SECTION_NAME "mozbldid" +#else +# define MOZ_BUILDID_SECTION_NAME ".note.moz.toolkit-build-id" +#endif + +#endif // MOZ_BUILDID_SECTION_NAME diff --git a/toolkit/library/gen_buildid.py b/toolkit/library/gen_buildid.py index 0078a5cfd6ae..d0a4f89b1410 100644 --- a/toolkit/library/gen_buildid.py +++ b/toolkit/library/gen_buildid.py @@ -20,13 +20,80 @@ def main(output, input_file): with open(input_file) as fh: objs = [l.strip() for l in fh.readlines()] - pp = Preprocessor() - pp.out = StringIO() - pp.do_include(os.path.join(buildconfig.topobjdir, "buildid.h")) - buildid = pp.context["MOZ_BUILDID"] - output.write('extern const char gToolkitBuildID[] = "%s";' % buildid) + write_file(output, None) + return set( os.path.join("build", o) for o in objs if os.path.splitext(os.path.basename(o))[0] != "buildid" ) + + +def tests(output, buildid): + write_file(output, buildid) + + +def write_file(output, maybe_buildid): + pp = Preprocessor() + pp.out = StringIO() + pp.do_include(os.path.join(buildconfig.topobjdir, "buildid.h")) + buildid = pp.context["MOZ_BUILDID"] if maybe_buildid is None else maybe_buildid + + keyword_extern = "extern" if maybe_buildid is None else "" + attribute_used = "__attribute__((used))" if maybe_buildid is not None else "" + + output.write( + """ +#include "buildid_section.h" + +#if defined(XP_DARWIN) || defined(XP_WIN) +#define SECTION_NAME_ATTRIBUTE __attribute__((section(MOZ_BUILDID_SECTION_NAME))) +#else +#define SECTION_NAME_ATTRIBUTE +#endif + +{extern} const char gToolkitBuildID[] SECTION_NAME_ATTRIBUTE {used} = "{buildid}"; +""".format( + extern=keyword_extern, + used=attribute_used, + buildid=buildid, + ) + ) + + if buildconfig.substs.get("TARGET_KERNEL") not in ( + "Darwin", + "WINNT", + ): + elf_note = """ +#include + +#define note_name "mzbldid" +#define note_desc "{buildid}" + +// This is not defined on Android? +// Android also hardcodes "1" +// https://android.googlesource.com/platform/ndk/+/refs/tags/ndk-r26c/sources/crt/crtbrand.S#35 +#ifndef NT_VERSION +#define NT_VERSION 1 +#endif + +struct note {{ + Elf32_Nhdr header; // Elf32 or Elf64 doesn't matter, they're the same size + char name[(sizeof(note_name) + 3) / 4 * 4]; + char desc[(sizeof(note_desc) + 3) / 4 * 4]; +}}; + +{extern} const struct note gNoteToolkitBuildID __attribute__((section(MOZ_BUILDID_SECTION_NAME), aligned(4), used)) = {{ + {{ sizeof(note_name), sizeof(note_desc), NT_VERSION }}, + note_name, + note_desc +}}; +""" + output.write( + "{}".format( + elf_note.format( + extern=keyword_extern, + buildid=buildid, + ) + ) + ) diff --git a/toolkit/library/moz.build b/toolkit/library/moz.build index 6a5e5328e426..0c33d490fdbd 100644 --- a/toolkit/library/moz.build +++ b/toolkit/library/moz.build @@ -412,3 +412,7 @@ if CONFIG["COMPILE_ENVIRONMENT"]: GeneratedFile( "buildid.cpp", script="gen_buildid.py", inputs=["!build/%s.list" % libxul_list] ) + + EXPORTS += [ + "buildid_section.h", + ]