[llvm-dev] How to objcopy via LLVM toolchain for armv7e-m ELF32LE?

Leslie Zhai via llvm-dev llvm-dev at lists.llvm.org
Sun Nov 12 22:14:34 PST 2017


Is it able to just workaround add ELF32LE?


diff --git a/tools/llvm-objcopy/llvm-objcopy.cpp 
b/tools/llvm-objcopy/llvm-objcopy.cpp
index 54186f6..3234c65 100644
--- a/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -138,18 +138,19 @@ void SplitDWOToFile(const ELFObjectFile<ELFT> 
&ObjFile, StringRef File) {
    WriteObjectFile(DWOFile, File);
  }

-void CopyBinary(const ELFObjectFile<ELF64LE> &ObjFile) {
-  std::unique_ptr<Object<ELF64LE>> Obj;
+template <class ELFT = ELF64LE>
+void CopyBinary(const ELFObjectFile<ELFT> &ObjFile) {
+  std::unique_ptr<Object<ELFT>> Obj;

    if (!OutputFormat.empty() && OutputFormat != "binary")
      error("invalid output format '" + OutputFormat + "'");
    if (!OutputFormat.empty() && OutputFormat == "binary")
-    Obj = llvm::make_unique<BinaryObject<ELF64LE>>(ObjFile);
+    Obj = llvm::make_unique<BinaryObject<ELFT>>(ObjFile);
    else
-    Obj = llvm::make_unique<ELFObject<ELF64LE>>(ObjFile);
+    Obj = llvm::make_unique<ELFObject<ELFT>>(ObjFile);

    if (!SplitDWO.empty())
-    SplitDWOToFile<ELF64LE>(ObjFile, SplitDWO.getValue());
+    SplitDWOToFile<ELFT>(ObjFile, SplitDWO.getValue());

    SectionPred RemovePred = [](const SectionBase &) { return false; };

@@ -200,6 +201,9 @@ int main(int argc, char **argv) {
    if (ELFObjectFile<ELF64LE> *o = 
dyn_cast<ELFObjectFile<ELF64LE>>(&Binary)) {
      CopyBinary(*o);
      return 0;
+  } else if (ELFObjectFile<ELF32LE> *o = 
dyn_cast<ELFObjectFile<ELF32LE>>(&Binary)) {
+    CopyBinary(*o);
+    return 0;
    }
    reportError(InputFilename, object_error::invalid_file_type);
  }



在 2017年11月13日 11:32, Leslie Zhai 写道:
> Hi LLVM developers,
>
> As PR35281 mentioned:
>
> $ llvm-objcopy -O binary llvm-cortex-m7.elf llvm-cortex-m7.bin
> llvm-objcopy: 'llvm-cortex-m7.elf': The file was not recognized as a 
> valid object file.
>
>
> if (ELFObjectFile<ELF64LE> *o = 
> dyn_cast<ELFObjectFile<ELF64LE>>(&Binary)) 
> https://github.com/llvm-mirror/llvm/blob/master/tools/llvm-objcopy/llvm-objcopy.cpp#L200
>
>
> Please give me some hints about objcopy armv7e-m ELF32LE via LLVM 
> toolchain, thanks a lot!
>

-- 
Regards,
Leslie Zhai - https://reviews.llvm.org/p/xiangzhai/



More information about the llvm-dev mailing list