aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-objcopy/llvm-objcopy.cpp')
-rw-r--r--llvm/tools/llvm-objcopy/llvm-objcopy.cpp41
1 files changed, 37 insertions, 4 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 73db6612..ca6609f 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -35,6 +35,7 @@
#include "llvm/Support/FileOutputBuffer.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/Path.h"
+#include "llvm/Support/Process.h"
#include "llvm/Support/WithColor.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
@@ -161,6 +162,7 @@ struct CopyConfig {
bool DiscardAll = false;
bool OnlyKeepDebug = false;
bool KeepFileSymbols = false;
+ bool PreserveDates = false;
};
using SectionPred = std::function<bool(const SectionBase &Sec)>;
@@ -675,17 +677,44 @@ static void executeElfObjcopyOnArchive(const CopyConfig &Config,
reportError(Config.OutputFilename, std::move(E));
}
+static void restoreDateOnFile(StringRef Filename,
+ const sys::fs::file_status &Stat) {
+ int FD;
+
+ if (auto EC = sys::fs::openFileForWrite(Filename, FD))
+ reportError(Filename, EC);
+
+ if (auto EC = sys::fs::setLastAccessAndModificationTime(
+ FD, Stat.getLastAccessedTime(), Stat.getLastModificationTime()))
+ reportError(Filename, EC);
+
+ if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
+ reportError(Filename, EC);
+}
+
static void executeElfObjcopy(const CopyConfig &Config) {
+ sys::fs::file_status Stat;
+ if (Config.PreserveDates)
+ if (auto EC = sys::fs::status(Config.InputFilename, Stat))
+ reportError(Config.InputFilename, EC);
+
Expected<OwningBinary<llvm::object::Binary>> BinaryOrErr =
createBinary(Config.InputFilename);
if (!BinaryOrErr)
reportError(Config.InputFilename, BinaryOrErr.takeError());
- if (Archive *Ar = dyn_cast<Archive>(BinaryOrErr.get().getBinary()))
- return executeElfObjcopyOnArchive(Config, *Ar);
+ if (Archive *Ar = dyn_cast<Archive>(BinaryOrErr.get().getBinary())) {
+ executeElfObjcopyOnArchive(Config, *Ar);
+ } else {
+ FileBuffer FB(Config.OutputFilename);
+ executeElfObjcopyOnBinary(Config, *BinaryOrErr.get().getBinary(), FB);
+ }
- FileBuffer FB(Config.OutputFilename);
- executeElfObjcopyOnBinary(Config, *BinaryOrErr.get().getBinary(), FB);
+ if (Config.PreserveDates) {
+ restoreDateOnFile(Config.OutputFilename, Stat);
+ if (!Config.SplitDWO.empty())
+ restoreDateOnFile(Config.SplitDWO, Stat);
+ }
}
// ParseObjcopyOptions returns the config and sets the input arguments. If a
@@ -780,6 +809,8 @@ static CopyConfig parseObjcopyOptions(ArrayRef<const char *> ArgsArr) {
for (auto Arg : InputArgs.filtered(OBJCOPY_keep_symbol))
Config.SymbolsToKeep.push_back(Arg->getValue());
+ Config.PreserveDates = InputArgs.hasArg(OBJCOPY_preserve_dates);
+
return Config;
}
@@ -834,6 +865,8 @@ static CopyConfig parseStripOptions(ArrayRef<const char *> ArgsArr) {
for (auto Arg : InputArgs.filtered(STRIP_keep_symbol))
Config.SymbolsToKeep.push_back(Arg->getValue());
+ Config.PreserveDates = InputArgs.hasArg(STRIP_preserve_dates);
+
return Config;
}