mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-23 04:41:11 +00:00
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
This commit is contained in:
parent
b26f1922fb
commit
8a62107260
15
toolkit/library/buildid_section.h
Normal file
15
toolkit/library/buildid_section.h
Normal file
@ -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
|
@ -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 <elf.h>
|
||||
|
||||
#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,
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -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",
|
||||
]
|
||||
|
Loading…
Reference in New Issue
Block a user