ElfBinary.Mod 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. MODULE ElfBinary; (** AUTHOR "GF"; PURPOSE "build ELF binary"; *)
  2. (* Build an ELF binary by concatenating the loader and a statically linked program *)
  3. IMPORT Files, Commands, Streams, Strings;
  4. CONST
  5. HeaderPart = "A2Loader.elf";
  6. StartPos = 10*1024; (* cf. A2Loader.c *)
  7. PROCEDURE NewFile( CONST name: ARRAY OF CHAR; log: Streams.Writer ): Files.File;
  8. VAR
  9. name2: ARRAY 128 OF CHAR; res: LONGINT;
  10. BEGIN
  11. IF Files.Old( name ) # NIL THEN
  12. COPY( name, name2); Strings.Append( name2, ".Bak" );
  13. Files.Rename( name, name2, res );
  14. log.String( "Backup created in " ); log.String( name2 ); log.Ln
  15. END;
  16. RETURN Files.New( name )
  17. END NewFile;
  18. PROCEDURE Open( CONST name: ARRAY OF CHAR; log: Streams.Writer ): Files.File;
  19. VAR f: Files.File;
  20. BEGIN
  21. f := Files.Old( name );
  22. IF f = NIL THEN
  23. log.String( name ); log.String( " not found" ); log.Ln;
  24. log.Update;
  25. END;
  26. RETURN f
  27. END Open;
  28. PROCEDURE Build*( cc: Commands.Context );
  29. VAR in1, in2, out: Files.File; r: Files.Reader; w: Files.Writer;
  30. inputname, token, outputname: ARRAY 64 OF CHAR;
  31. size, i: SIZE; c: CHAR;
  32. BEGIN
  33. IF cc.arg.GetString( inputname ) &
  34. cc.arg.GetString( token ) & (token = "->") &
  35. cc.arg.GetString( outputname ) THEN
  36. in1 := Open( HeaderPart, cc.error );
  37. in2 := Open( inputname, cc.error );
  38. IF (in1 = NIL) OR (in2 = NIL) THEN RETURN END;
  39. size := in1.Length(); Files.OpenReader( r, in1, 0 );
  40. out := NewFile( outputname, cc.out ); Files.OpenWriter( w, out, 0 );
  41. FOR i := 1 TO size DO r.Char( c ); w.Char( c ) END;
  42. FOR i := 1 TO StartPos - size DO w.Char( '#' ) END;
  43. size := in2.Length(); Files.OpenReader( r, in2, 0 );
  44. FOR i := 1 TO size DO r.Char( c ); w.Char( c ) END;
  45. w.Update; Files.Register( out );
  46. cc.out.String( outputname ); cc.out.String( " created" ); cc.out.Ln;
  47. ELSE
  48. cc.error.String( "usage: ElfBinary.Build StatLinkedProgram -> ElfProgram" ); cc.error.Ln
  49. END;
  50. cc.error.Update;
  51. cc.out.Update
  52. END Build;
  53. END ElfBinary.
  54. SystemTools.Free ElfBinary ~
  55. ElfBinary.Build Solaris32G.core -> SolarisA2 ~