bfd_objcopy.erl 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. -module(bfd_objcopy).
  2. -description("Embed binaries into object files").
  3. -author('Vladimir Kirillov').
  4. -compile(export_all).
  5. blob_to_src(TargetFile, SymPrefix, Blob) when is_list(Blob) orelse is_binary(Blob) ->
  6. file:write_file(TargetFile, binary_to_c_iolist(SymPrefix, Blob)).
  7. binary_to_c_iolist(Sym, Blob) ->
  8. Size = integer_to_list(size(Blob)),
  9. P1 = ["const char ", Sym, "_start[] = {\n"],
  10. Chars = [ case is_ascii(C) of
  11. true -> [$ , $', C, $'];
  12. false when C < 16 -> [$0, $x, $0, integer_to_list(C, 16)];
  13. false -> [$0, $x, integer_to_list(C, 16)]
  14. end || C <- binary_to_list(Blob) ],
  15. Intercalated = array_format(Chars),
  16. P2 = ["const unsigned long ", Sym, "_size = ", Size, ";\n"],
  17. P3 = ["const char *", Sym, "_end = (char *)&", Sym, "_start + ", Size, ";\n"],
  18. [ P1, Intercalated, "\n};\n", P2, P3 ].
  19. is_ascii(C) when C >= $0, C =< $9 -> true;
  20. is_ascii(C) when C >= $a, C =< $z -> true;
  21. is_ascii(C) when C >= $A, C =< $Z -> true;
  22. is_ascii(_) -> false.
  23. array_format(Xs) -> ["", intersperse(<<", ">>, <<"\n">>, 10, Xs)].
  24. intersperse(Sep, GroupSep, Count, Xs) -> xsperse(Sep, GroupSep, Count, Xs, 0).
  25. xsperse(_,_, _, [],_)-> [];
  26. xsperse(_,_, _, [X], _)-> [X];
  27. xsperse(Sep, GS, Count, [X|Xs], Count) -> [X, [Sep, GS]|xsperse(Sep, GS, Count, Xs, 0)];
  28. xsperse(Sep, GS, Count, [X|Xs], N) -> [X, Sep|xsperse(Sep, GS, Count, Xs, N + 1)].