Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lld/ELF/Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ struct Config {
StringRef thinLTOJobs;
unsigned timeTraceGranularity;
int32_t splitStackAdjustSize;
StringRef packageMetadata;
SmallVector<uint8_t, 0> packageMetadata;

// The following config options do not directly correspond to any
// particular command line options.
Expand Down
23 changes: 22 additions & 1 deletion lld/ELF/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,26 @@ static ICFLevel getICF(opt::InputArgList &args) {
return ICFLevel::All;
}

static void parsePackageMetadata(Ctx &ctx, const opt::Arg &arg) {
unsigned c0, c1;
SmallVector<uint8_t, 0> decoded;
StringRef s = arg.getValue();
for (size_t i = 0, e = s.size(); i != e; ++i) {
if (s[i] != '%') {
decoded.push_back(s[i]);
} else if (i + 2 < e && (c1 = hexDigitValue(s[i + 1])) != -1u &&
(c0 = hexDigitValue(s[i + 2])) != -1u) {
decoded.push_back(uint8_t(c1 * 16 + c0));
i += 2;
} else {
ErrAlways(ctx) << arg.getSpelling() << ": invalid % escape at byte " << i
<< "; supports only %[0-9a-fA-F][0-9a-fA-F]";
return;
}
}
ctx.arg.packageMetadata = std::move(decoded);
}

static StripPolicy getStrip(Ctx &ctx, opt::InputArgList &args) {
if (args.hasArg(OPT_relocatable))
return StripPolicy::None;
Expand Down Expand Up @@ -1425,7 +1445,8 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
ctx.arg.optimize = args::getInteger(args, OPT_O, 1);
ctx.arg.orphanHandling = getOrphanHandling(ctx, args);
ctx.arg.outputFile = args.getLastArgValue(OPT_o);
ctx.arg.packageMetadata = args.getLastArgValue(OPT_package_metadata);
if (auto *arg = args.getLastArg(OPT_package_metadata))
parsePackageMetadata(ctx, *arg);
ctx.arg.pie = args.hasFlag(OPT_pie, OPT_no_pie, false);
ctx.arg.printIcfSections =
args.hasFlag(OPT_print_icf_sections, OPT_no_print_icf_sections, false);
Expand Down
2 changes: 1 addition & 1 deletion lld/ELF/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -578,7 +578,7 @@ def z: JoinedOrSeparate<["-"], "z">, MetaVarName<"<option>">,
def visual_studio_diagnostics_format : FF<"vs-diagnostics">,
HelpText<"Format diagnostics for Visual Studio compatibility">;

def package_metadata: JJ<"package-metadata=">, HelpText<"Emit package metadata note">;
def package_metadata: JJ<"package-metadata=">, HelpText<"Emit a percent-encoded string to the .note.package section">;

// Aliases
def: Separate<["-"], "dT">, Alias<default_script>, HelpText<"Alias for --default-script">;
Expand Down
4 changes: 4 additions & 0 deletions lld/docs/ld.lld.1
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,10 @@ If
.Fl -use-android-relr-tags
is specified, use SHT_ANDROID_RELR instead of SHT_RELR.
.Pp
.It Fl -package-metadata
Emit a percent-encoded string to the
.Cm .note.package
section. For example, %25 decodes to a single %.
.It Fl -pic-veneer
Always generate position independent thunks.
.It Fl -pie , Fl -pic-executable
Expand Down
20 changes: 15 additions & 5 deletions lld/test/ELF/package-metadata.s
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
# REQUIRES: x86
# RUN: rm -rf %t && split-file %s %t && cd %t
# RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o

# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
# RUN: ld.lld a.o --package-metadata='{}'
# RUN: llvm-readelf -n a.out | FileCheck %s --check-prefixes=NOTE,FIRST

# RUN: ld.lld %t.o -o %t --package-metadata='{}'
# RUN: llvm-readelf -n %t | FileCheck %s --check-prefixes=NOTE,FIRST
# RUN: ld.lld a.o --package-metadata='{"abc":123}'
# RUN: llvm-readelf -n a.out | FileCheck %s --check-prefixes=NOTE,SECOND

# RUN: ld.lld %t.o -o %t --package-metadata='{"abc":123}'
# RUN: llvm-readelf -n %t | FileCheck %s --check-prefixes=NOTE,SECOND
# RUN: ld.lld a.o --package-metadata='%7b%22abc%22:123%7D'
# RUN: llvm-readelf -n a.out | FileCheck %s --check-prefixes=NOTE,SECOND

# NOTE: .note.package
# NOTE-NEXT: Owner
# NOTE-NEXT: FDO 0x{{.*}} Unknown note type: (0xcafe1a7e)
# FIRST-NEXT: description data: 7b 7d 00
# SECOND-NEXT: description data: 7b 22 61 62 63 22 3a 31 32 33 7d 00

# RUN: not ld.lld a.o --package-metadata='%7b%' 2>&1 | FileCheck %s --check-prefix=ERR
# RUN: not ld.lld a.o --package-metadata='%7b%7' 2>&1 | FileCheck %s --check-prefix=ERR
# RUN: not ld.lld a.o --package-metadata='%7b%7g' 2>&1 | FileCheck %s --check-prefix=ERR

# ERR: error: --package-metadata=: invalid % escape at byte 3; supports only %[0-9a-fA-F][0-9a-fA-F]

#--- a.s
.globl _start
_start:
ret