diff options
author | Petr Hosek <phosek@chromium.org> | 2017-08-04 03:17:37 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2017-08-04 03:17:37 +0000 |
commit | 10fbc733d09d4ac2f159f78c4a31c0ab8e394c50 (patch) | |
tree | c143d703292969d5aa3792d3bcf8ee865b488510 /llvm/tools/llvm-objcopy/llvm-objcopy.cpp | |
parent | 83214dfb01d45aa57e3cb0b1a9314e0e3d83e281 (diff) | |
download | bcm5719-llvm-10fbc733d09d4ac2f159f78c4a31c0ab8e394c50.tar.gz bcm5719-llvm-10fbc733d09d4ac2f159f78c4a31c0ab8e394c50.zip |
Reland "[llvm][llvm-objcopy] Added support for outputting to binary in llvm-objcopy"
This change adds the "-O binary" flag which directs llvm-objcopy to
output the object file to the same format as GNU objcopy does when given
the flag "-O binary". This was done by splitting the Object class into
two subclasses ObjectELF and ObjectBianry which each output a different
format but relay on the same code to read in the Object in Object.
Patch by Jake Ehrlich
Differential Revision: https://reviews.llvm.org/D34480
llvm-svn: 310018
Diffstat (limited to 'llvm/tools/llvm-objcopy/llvm-objcopy.cpp')
-rw-r--r-- | llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp index 09edc4c3327..9b233951b8d 100644 --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -53,13 +53,23 @@ LLVM_ATTRIBUTE_NORETURN void reportError(StringRef File, llvm::Error E) { cl::opt<std::string> InputFilename(cl::Positional, cl::desc("<input>")); cl::opt<std::string> OutputFilename(cl::Positional, cl::desc("<output>"), cl::init("-")); +cl::opt<std::string> + OutputFormat("O", cl::desc("set output format to one of the following:" + "\n\tbinary")); void CopyBinary(const ELFObjectFile<ELF64LE> &ObjFile) { std::unique_ptr<FileOutputBuffer> Buffer; - Object<ELF64LE> Obj{ObjFile}; - Obj.finalize(); + std::unique_ptr<Object<ELF64LE>> Obj; + if (!OutputFormat.empty() && OutputFormat != "binary") + error("invalid output format '" + OutputFormat + "'"); + + if (!OutputFormat.empty() && OutputFormat == "binary") + Obj = llvm::make_unique<BinaryObject<ELF64LE>>(ObjFile); + else + Obj = llvm::make_unique<ELFObject<ELF64LE>>(ObjFile); + Obj->finalize(); ErrorOr<std::unique_ptr<FileOutputBuffer>> BufferOrErr = - FileOutputBuffer::create(OutputFilename, Obj.totalSize(), + FileOutputBuffer::create(OutputFilename, Obj->totalSize(), FileOutputBuffer::F_executable); if (BufferOrErr.getError()) error("failed to open " + OutputFilename); @@ -68,7 +78,7 @@ void CopyBinary(const ELFObjectFile<ELF64LE> &ObjFile) { std::error_code EC; if (EC) report_fatal_error(EC.message()); - Obj.write(*Buffer); + Obj->write(*Buffer); if (auto EC = Buffer->commit()) reportError(OutputFilename, EC); } |