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

119 views
Skip to first unread message

Leslie Zhai via llvm-dev

unread,
Nov 12, 2017, 10:33:14 PM11/12/17
to peter...@linaro.org, LLVM Developers Mailing List
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/

_______________________________________________
LLVM Developers mailing list
llvm...@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

Leslie Zhai via llvm-dev

unread,
Nov 13, 2017, 1:15:14 AM11/13/17
to peter...@linaro.org, dbla...@gmail.com, jh7...@my.bristol.ac.uk, LLVM Developers Mailing List
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);

Leslie Zhai via llvm-dev

unread,
Nov 13, 2017, 2:01:39 AM11/13/17
to peter...@linaro.org, dbla...@gmail.com, jh7...@my.bristol.ac.uk, LLVM Developers Mailing List
Testcase:
https://github.com/xiangzhai/mini-arm-os/tree/llvm-toolchain/00-HelloWorld

$ make
 CC hello.c
 CC startup.c
 LD hello.elf
 READ -> hello.rd
 LIST -> hello.lst
 COPY -> hello.bin
   text    data     bss     dec     hex filename
    190      14       0     204      cc hello.elf

$ make qemu
/data/project/qemu_stm32/arm-softmmu/qemu-system-arm -M stm32-p103
-nographic -kernel hello.bin

...
LED Off
Hello World!

James Henderson via llvm-dev

unread,
Nov 13, 2017, 9:28:01 AM11/13/17
to Leslie Zhai, LLVM Developers Mailing List
Hi,

At the moment, we've only added support for 64-bit Little Endian ELF to llvm-objcopy, but I'm pretty sure most of the code should be able to handle 32-bit ELF as well, with a patch such as the one you've attached. Jake Ehrlich (CC'ed), who is the main developer on llvm-objcopy should be able to give you a more complete answer.

Regards,

James

Leslie Zhai via llvm-dev

unread,
Nov 13, 2017, 9:08:34 PM11/13/17
to jh737...@my.bristol.ac.uk, LLVM Developers Mailing List
Hi James,

Thanks for your kind response!

Jake has already provided the great patch
https://reviews.llvm.org/D39977 The Flash Man :) so quick response to
cover ARMmbed usecase for armv7e-m!

Thanks again for your great job!


在 2017年11月13日 22:27, James Henderson 写道:
> Hi,
>
> At the moment, we've only added support for 64-bit Little Endian ELF
> to llvm-objcopy, but I'm pretty sure most of the code should be able
> to handle 32-bit ELF as well, with a patch such as the one you've
> attached. Jake Ehrlich (CC'ed), who is the main developer on
> llvm-objcopy should be able to give you a more complete answer.
>
> Regards,
>
> James
>
> On 13 November 2017 at 07:00, Leslie Zhai via llvm-dev

> llvm...@lists.llvm.org <mailto:llvm...@lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>

Reply all
Reply to author
Forward
0 new messages