[ELF] Inspect -EL & -EB for OUTPUT_FORMAT(default, big, little)

Choose big if -EB is specified, little if -EL is specified, or default if neither is specified.
The new behavior matches GNU ld.

Fixes: https://github.com/ClangBuiltLinux/linux/issues/1025

Differential Revision: https://reviews.llvm.org/D96214
This commit is contained in:
Fangrui Song
2021-02-08 10:34:57 -08:00
parent 2b92f21c6e
commit eea34aae2e
7 changed files with 47 additions and 14 deletions

View File

@@ -431,13 +431,26 @@ static std::pair<ELFKind, uint16_t> parseBfdName(StringRef s) {
.Default({ELFNoneKind, EM_NONE});
}
// Parse OUTPUT_FORMAT(bfdname) or OUTPUT_FORMAT(bfdname, big, little).
// Currently we ignore big and little parameters.
// Parse OUTPUT_FORMAT(bfdname) or OUTPUT_FORMAT(default, big, little). Choose
// big if -EB is specified, little if -EL is specified, or default if neither is
// specified.
void ScriptParser::readOutputFormat() {
expect("(");
StringRef s;
config->bfdname = unquote(next());
StringRef s = config->bfdname;
if (!consume(")")) {
expect(",");
s = unquote(next());
if (config->optEB)
config->bfdname = s;
expect(",");
s = unquote(next());
if (config->optEL)
config->bfdname = s;
consume(")");
}
s = config->bfdname;
if (s.consume_back("-freebsd"))
config->osabi = ELFOSABI_FREEBSD;
@@ -448,14 +461,6 @@ void ScriptParser::readOutputFormat() {
config->mipsN32Abi = true;
if (config->emachine == EM_MSP430)
config->osabi = ELFOSABI_STANDALONE;
if (consume(")"))
return;
expect(",");
skip();
expect(",");
skip();
expect(")");
}
void ScriptParser::readPhdrs() {