2017-04-20 01:02:10 +02:00
|
|
|
//===- SymbolicFile.cpp - Interface that only provides symbols ------------===//
|
2014-02-21 21:10:59 +01:00
|
|
|
//
|
2019-01-19 09:50:56 +01:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2014-02-21 21:10:59 +01:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file defines a file format independent SymbolicFile class.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2017-06-06 13:49:48 +02:00
|
|
|
#include "llvm/Object/SymbolicFile.h"
|
2017-04-20 01:02:10 +02:00
|
|
|
#include "llvm/ADT/StringRef.h"
|
2017-06-07 05:48:56 +02:00
|
|
|
#include "llvm/BinaryFormat/Magic.h"
|
2015-08-28 09:40:30 +02:00
|
|
|
#include "llvm/Object/COFFImportFile.h"
|
2017-04-20 01:02:10 +02:00
|
|
|
#include "llvm/Object/Error.h"
|
2014-02-21 21:10:59 +01:00
|
|
|
#include "llvm/Object/IRObjectFile.h"
|
|
|
|
#include "llvm/Object/ObjectFile.h"
|
2017-04-20 01:02:10 +02:00
|
|
|
#include "llvm/Support/Compiler.h"
|
|
|
|
#include "llvm/Support/Error.h"
|
|
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
|
|
#include "llvm/Support/ErrorOr.h"
|
|
|
|
#include "llvm/Support/FileSystem.h"
|
2014-02-21 21:10:59 +01:00
|
|
|
#include "llvm/Support/MemoryBuffer.h"
|
2017-04-20 01:02:10 +02:00
|
|
|
#include <algorithm>
|
|
|
|
#include <memory>
|
2014-02-21 21:10:59 +01:00
|
|
|
|
|
|
|
using namespace llvm;
|
|
|
|
using namespace object;
|
|
|
|
|
2014-08-19 20:44:46 +02:00
|
|
|
SymbolicFile::SymbolicFile(unsigned int Type, MemoryBufferRef Source)
|
|
|
|
: Binary(Type, Source) {}
|
2014-02-21 21:10:59 +01:00
|
|
|
|
2017-04-20 01:02:10 +02:00
|
|
|
SymbolicFile::~SymbolicFile() = default;
|
2014-02-21 21:10:59 +01:00
|
|
|
|
2017-06-07 05:48:56 +02:00
|
|
|
Expected<std::unique_ptr<SymbolicFile>>
|
|
|
|
SymbolicFile::createSymbolicFile(MemoryBufferRef Object, file_magic Type,
|
2020-11-09 10:18:18 +01:00
|
|
|
LLVMContext *Context, bool InitContent) {
|
2014-08-19 20:44:46 +02:00
|
|
|
StringRef Data = Object.getBuffer();
|
2017-06-07 05:48:56 +02:00
|
|
|
if (Type == file_magic::unknown)
|
|
|
|
Type = identify_magic(Data);
|
2014-02-21 21:10:59 +01:00
|
|
|
|
[Archive] Don't throw away errors for malformed archive members
When adding an archive member with a problem, e.g. a new bitcode with an
old archiver, containing an unsupported attribute, or an ELF file with a
malformed symbol table, the archiver would throw away the error and
simply add the member to the archive without any symbol entries. This
meant that the resultant archive could be silently unusable when not
using --whole-archive, and result in unexpected undefined symbols.
This change fixes this issue by addressing two FIXMEs and only throwing
away not-an-object errors. However, this meant that some LLD tests which
didn't need symbol tables and were using invalid members deliberately to
test the linker's malformed input handling no longer worked, so this
patch also stops the archiver from looking for symbols in an object if
it doesn't require a symbol table, and updates the tests accordingly.
Differential Revision: https://reviews.llvm.org/D88288
Reviewed by: grimar, rupprecht, MaskRay
2020-09-25 11:21:39 +02:00
|
|
|
if (!isSymbolicFile(Type, Context))
|
|
|
|
return errorCodeToError(object_error::invalid_file_type);
|
|
|
|
|
2014-02-21 21:10:59 +01:00
|
|
|
switch (Type) {
|
2017-06-07 05:48:56 +02:00
|
|
|
case file_magic::bitcode:
|
[Archive] Don't throw away errors for malformed archive members
When adding an archive member with a problem, e.g. a new bitcode with an
old archiver, containing an unsupported attribute, or an ELF file with a
malformed symbol table, the archiver would throw away the error and
simply add the member to the archive without any symbol entries. This
meant that the resultant archive could be silently unusable when not
using --whole-archive, and result in unexpected undefined symbols.
This change fixes this issue by addressing two FIXMEs and only throwing
away not-an-object errors. However, this meant that some LLD tests which
didn't need symbol tables and were using invalid members deliberately to
test the linker's malformed input handling no longer worked, so this
patch also stops the archiver from looking for symbols in an object if
it doesn't require a symbol table, and updates the tests accordingly.
Differential Revision: https://reviews.llvm.org/D88288
Reviewed by: grimar, rupprecht, MaskRay
2020-09-25 11:21:39 +02:00
|
|
|
// Context is guaranteed to be non-null here, because bitcode magic only
|
|
|
|
// indicates a symbolic file when Context is non-null.
|
|
|
|
return IRObjectFile::create(Object, *Context);
|
2017-06-07 05:48:56 +02:00
|
|
|
case file_magic::elf:
|
|
|
|
case file_magic::elf_executable:
|
|
|
|
case file_magic::elf_shared_object:
|
|
|
|
case file_magic::elf_core:
|
2021-07-20 16:50:18 +02:00
|
|
|
case file_magic::goff_object:
|
2017-06-07 05:48:56 +02:00
|
|
|
case file_magic::macho_executable:
|
|
|
|
case file_magic::macho_fixed_virtual_memory_shared_lib:
|
|
|
|
case file_magic::macho_core:
|
|
|
|
case file_magic::macho_preload_executable:
|
|
|
|
case file_magic::macho_dynamically_linked_shared_lib:
|
|
|
|
case file_magic::macho_dynamic_linker:
|
|
|
|
case file_magic::macho_bundle:
|
|
|
|
case file_magic::macho_dynamically_linked_shared_lib_stub:
|
|
|
|
case file_magic::macho_dsym_companion:
|
|
|
|
case file_magic::macho_kext_bundle:
|
|
|
|
case file_magic::pecoff_executable:
|
[XCOFF] Add functionality for parsing AIX XCOFF object file headers
Summary:
1. Add functionality for parsing AIX XCOFF object files headers.
2. Only support 32-bit AIX XCOFF object files in this patch.
3. Print out the AIX XCOFF object file header in YAML format.
Reviewers: sfertile, hubert.reinterpretcast, jasonliu, mstorsjo, zturner, rnk
Reviewed By: sfertile, hubert.reinterpretcast
Subscribers: jsji, mgorny, hiraditya, jdoerfert, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D59419
Patch by Digger Lin
llvm-svn: 357663
2019-04-04 02:53:21 +02:00
|
|
|
case file_magic::xcoff_object_32:
|
2019-07-09 20:09:11 +02:00
|
|
|
case file_magic::xcoff_object_64:
|
2017-06-07 05:48:56 +02:00
|
|
|
case file_magic::wasm_object:
|
2020-11-09 10:18:18 +01:00
|
|
|
return ObjectFile::createObjectFile(Object, Type, InitContent);
|
2017-06-07 05:48:56 +02:00
|
|
|
case file_magic::coff_import_library:
|
2015-08-28 09:40:30 +02:00
|
|
|
return std::unique_ptr<SymbolicFile>(new COFFImportFile(Object));
|
2017-06-07 05:48:56 +02:00
|
|
|
case file_magic::elf_relocatable:
|
|
|
|
case file_magic::macho_object:
|
|
|
|
case file_magic::coff_object: {
|
2016-04-07 00:14:09 +02:00
|
|
|
Expected<std::unique_ptr<ObjectFile>> Obj =
|
2020-11-09 10:18:18 +01:00
|
|
|
ObjectFile::createObjectFile(Object, Type, InitContent);
|
2014-09-18 23:28:49 +02:00
|
|
|
if (!Obj || !Context)
|
2020-02-10 16:06:45 +01:00
|
|
|
return std::move(Obj);
|
2014-09-18 23:28:49 +02:00
|
|
|
|
2017-10-11 20:07:18 +02:00
|
|
|
Expected<MemoryBufferRef> BCData =
|
2014-09-18 23:28:49 +02:00
|
|
|
IRObjectFile::findBitcodeInObject(*Obj->get());
|
2017-10-11 20:07:18 +02:00
|
|
|
if (!BCData) {
|
|
|
|
consumeError(BCData.takeError());
|
2020-02-10 16:06:45 +01:00
|
|
|
return std::move(Obj);
|
2017-10-11 20:07:18 +02:00
|
|
|
}
|
2014-09-18 23:28:49 +02:00
|
|
|
|
2016-11-13 08:00:17 +01:00
|
|
|
return IRObjectFile::create(
|
|
|
|
MemoryBufferRef(BCData->getBuffer(), Object.getBufferIdentifier()),
|
|
|
|
*Context);
|
2014-09-18 23:28:49 +02:00
|
|
|
}
|
[Archive] Don't throw away errors for malformed archive members
When adding an archive member with a problem, e.g. a new bitcode with an
old archiver, containing an unsupported attribute, or an ELF file with a
malformed symbol table, the archiver would throw away the error and
simply add the member to the archive without any symbol entries. This
meant that the resultant archive could be silently unusable when not
using --whole-archive, and result in unexpected undefined symbols.
This change fixes this issue by addressing two FIXMEs and only throwing
away not-an-object errors. However, this meant that some LLD tests which
didn't need symbol tables and were using invalid members deliberately to
test the linker's malformed input handling no longer worked, so this
patch also stops the archiver from looking for symbols in an object if
it doesn't require a symbol table, and updates the tests accordingly.
Differential Revision: https://reviews.llvm.org/D88288
Reviewed by: grimar, rupprecht, MaskRay
2020-09-25 11:21:39 +02:00
|
|
|
default:
|
|
|
|
llvm_unreachable("Unexpected Binary File Type");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SymbolicFile::isSymbolicFile(file_magic Type, const LLVMContext *Context) {
|
|
|
|
switch (Type) {
|
|
|
|
case file_magic::bitcode:
|
|
|
|
return Context != nullptr;
|
|
|
|
case file_magic::elf:
|
|
|
|
case file_magic::elf_executable:
|
|
|
|
case file_magic::elf_shared_object:
|
|
|
|
case file_magic::elf_core:
|
2021-07-20 16:50:18 +02:00
|
|
|
case file_magic::goff_object:
|
[Archive] Don't throw away errors for malformed archive members
When adding an archive member with a problem, e.g. a new bitcode with an
old archiver, containing an unsupported attribute, or an ELF file with a
malformed symbol table, the archiver would throw away the error and
simply add the member to the archive without any symbol entries. This
meant that the resultant archive could be silently unusable when not
using --whole-archive, and result in unexpected undefined symbols.
This change fixes this issue by addressing two FIXMEs and only throwing
away not-an-object errors. However, this meant that some LLD tests which
didn't need symbol tables and were using invalid members deliberately to
test the linker's malformed input handling no longer worked, so this
patch also stops the archiver from looking for symbols in an object if
it doesn't require a symbol table, and updates the tests accordingly.
Differential Revision: https://reviews.llvm.org/D88288
Reviewed by: grimar, rupprecht, MaskRay
2020-09-25 11:21:39 +02:00
|
|
|
case file_magic::macho_executable:
|
|
|
|
case file_magic::macho_fixed_virtual_memory_shared_lib:
|
|
|
|
case file_magic::macho_core:
|
|
|
|
case file_magic::macho_preload_executable:
|
|
|
|
case file_magic::macho_dynamically_linked_shared_lib:
|
|
|
|
case file_magic::macho_dynamic_linker:
|
|
|
|
case file_magic::macho_bundle:
|
|
|
|
case file_magic::macho_dynamically_linked_shared_lib_stub:
|
|
|
|
case file_magic::macho_dsym_companion:
|
|
|
|
case file_magic::macho_kext_bundle:
|
|
|
|
case file_magic::pecoff_executable:
|
|
|
|
case file_magic::xcoff_object_32:
|
|
|
|
case file_magic::xcoff_object_64:
|
|
|
|
case file_magic::wasm_object:
|
|
|
|
case file_magic::coff_import_library:
|
|
|
|
case file_magic::elf_relocatable:
|
|
|
|
case file_magic::macho_object:
|
|
|
|
case file_magic::coff_object:
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return false;
|
2014-02-21 21:10:59 +01:00
|
|
|
}
|
|
|
|
}
|