123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- MODULE ElfBinary; (** AUTHOR "GF"; PURPOSE "build ELF binary"; *)
- (* Build an ELF binary by concatenating the loader and a statically linked program *)
- IMPORT Files, Commands, Streams, Strings;
- CONST
- HeaderPart = "A2Loader.elf";
- StartPos = 10*1024; (* cf. A2Loader.c *)
-
- PROCEDURE NewFile( CONST name: ARRAY OF CHAR; log: Streams.Writer ): Files.File;
- VAR
- name2: ARRAY 128 OF CHAR; res: LONGINT;
- BEGIN
- IF Files.Old( name ) # NIL THEN
- COPY( name, name2); Strings.Append( name2, ".Bak" );
- Files.Rename( name, name2, res );
- log.String( "Backup created in " ); log.String( name2 ); log.Ln
- END;
- RETURN Files.New( name )
- END NewFile;
-
- PROCEDURE Open( CONST name: ARRAY OF CHAR; log: Streams.Writer ): Files.File;
- VAR f: Files.File;
- BEGIN
- f := Files.Old( name );
- IF f = NIL THEN
- log.String( name ); log.String( " not found" ); log.Ln;
- log.Update;
- END;
- RETURN f
- END Open;
-
- PROCEDURE Build*( cc: Commands.Context );
- VAR in1, in2, out: Files.File; r: Files.Reader; w: Files.Writer;
- inputname, token, outputname: ARRAY 64 OF CHAR;
- size, i: SIZE; c: CHAR;
- BEGIN
- IF cc.arg.GetString( inputname ) &
- cc.arg.GetString( token ) & (token = "->") &
- cc.arg.GetString( outputname ) THEN
-
- in1 := Open( HeaderPart, cc.error );
- in2 := Open( inputname, cc.error );
- IF (in1 = NIL) OR (in2 = NIL) THEN RETURN END;
-
- size := in1.Length(); Files.OpenReader( r, in1, 0 );
- out := NewFile( outputname, cc.out ); Files.OpenWriter( w, out, 0 );
-
- FOR i := 1 TO size DO r.Char( c ); w.Char( c ) END;
-
- FOR i := 1 TO StartPos - size DO w.Char( '#' ) END;
-
- size := in2.Length(); Files.OpenReader( r, in2, 0 );
- FOR i := 1 TO size DO r.Char( c ); w.Char( c ) END;
-
- w.Update; Files.Register( out );
- cc.out.String( outputname ); cc.out.String( " created" ); cc.out.Ln;
- ELSE
- cc.error.String( "usage: ElfBinary.Build StatLinkedProgram -> ElfProgram" ); cc.error.Ln
- END;
- cc.error.Update;
- cc.out.Update
- END Build;
- END ElfBinary.
- SystemTools.Free ElfBinary ~
-
- ElfBinary.Build Solaris32G.core -> SolarisA2 ~
-
|