[exerb-dev] コア / アーカイブ結合方式の変更について

Back to archive index

NAKANO Kouichi knuck****@f8*****
2002年 5月 18日 (土) 16:46:00 JST


なかのです。

パッチを送ります。

以前の送ったr2e.rbに対するパッチをあてたあとに、
package、rb2exe、ruby-1.6.5を含むディレクトリで
ここに添付するパッチをあててください。
ひょっとするとTab問題で途中に手修正が必要かもし
れません。また、長い行が切れてるかもしれません。
申し訳ない。
いいメーラーないのかなぁ。


diff -rcw ./package/r2e.rb ../exerb/package/r2e.rb
*** ./package/r2e.rb Sat May 18 16:30:30 2002
--- ../exerb/package/r2e.rb Sat May 18 16:33:18 2002
***************
*** 542,548 ****

        def initialize(binary)
          @binary = binary
!  analyze
        end

        #==============================================================#
--- 542,549 ----

        def initialize(binary)
          @binary = binary
!         @pe_header = PEHeader.new(@binary, offset_to_pe)
!         @sections = Sections.new(@binary, @pe_header)
        end

        #==============================================================#
***************
*** 589,618 ****
          io.print(pack)
        end

-       def analyze
-  analyze_offset_to_pe
-  analyze_pe_header
-  analyze_sections
-       end
-
-       def analyze_offset_to_pe
-  @offset_to_pe = @binary[0x3c,4].unpack('L')[0]
-       end
-
-       def analyze_pe_header
-  @pe_header = PEHeader.new(@binary, @offset_to_pe)
-       end
-
-       def analyze_sections
-  @sections = Sections.new(@binary, @pe_header)
-       end
-
        def insert!(archive)
!  @sections.replace('.ruby', archive, @binary, section_alignment)
        end

        def pack
-  @binary[@pe_header.offset_to_section_headers, @pe_header.number_of_sections * 40] =****@secti*****_headers
   return @binary
        end

--- 590,601 ----
          io.print(pack)
        end

        def insert!(archive)
!         infomation_of_replacing =****@secti*****('.ruby', archive, @binary, @pe_header.section_alignment)
!         @pe_header.update(infomation_of_replacing)
        end

        def pack
          return @binary
        end

***************
*** 621,642 ****
        end

        def offset_to_section_alignment
!  @offset_to_pe + @pe_header.size_of_pe_signature + @pe_header.size + 32
        end

      end # Core


      #================================================================#
      # PEHeader Class
      class PEHeader
!
!       attr_reader :number_of_sections, :size_of_optional_header

        def initialize(core, offset)
   @offset_to_me = offset
!  @number_of_sections = core[offset + offset_to_number_of_sections, 2].unpack('S')[0]
!  @size_of_optional_header = core[offset + offset_to_size_of_optional_header, 2].unpack('S')[0]
        end

        def offset_to_number_of_sections
--- 604,652 ----
        end

        def offset_to_section_alignment
!         @pe_header.offset_to_section_alignment
!       end
!
!       def offset_to_pe
!         @binary[0x3c, 4].unpack('L')[0]
        end

      end # Core

+     module BinaryAccess
+       def get(offset, size, type)
+         @core[offset, size].unpack(type)[0]
+       end
+
+       def put(offset, size, type, value)
+         @core[offset, size] = [value].pack(type)
+       end
+     end

      #================================================================#
      # PEHeader Class
      class PEHeader
!       include BinaryAccess

        def initialize(core, offset)
          @offset_to_me = offset
!         @core = core
!       end
!
!       def number_of_sections
!         get(@offset_to_me + offset_to_number_of_sections, 2, 'S')
!       end
!
!       def size_of_optional_header
!         get(@offset_to_me + offset_to_size_of_optional_header, 2, 'S')
!       end
!
!       def size_of_image
!         get(offset_to_size_of_image, 4, 'L')
!       end
!
!       def set_size_of_image(number)
!         put(offset_to_size_of_image, 4, 'L', number)
        end

        def offset_to_number_of_sections
***************
*** 652,663 ****
        end

        def offset_to_section_headers
!  return @offset_to_me + size_of_pe_signature + 20 + size_of_optional_header
        end

!       def size
   20
        end
      end

      #================================================================#
--- 662,690 ----
        end

        def offset_to_section_headers
!         return @offset_to_me + size_of_pe_signature + size_of_coff_header + size_of_optional_header
        end

!       def offset_to_size_of_image
!         @offset_to_me + size_of_pe_signature + size_of_coff_header + 56
!       end
!
!       def update(replace_result)
!         result = size_of_image + replace_result.gain_of_raw_data
!         set_size_of_image(result)
!       end
!
!       def size_of_coff_header
          20
        end
+
+       def offset_to_section_alignment
+         @offset_to_me + size_of_pe_signature + size_of_coff_header + 32
+       end
+
+       def section_alignment
+         get(offset_to_section_alignment, 4, 'L')
+       end
      end

      #================================================================#
***************
*** 683,694 ****
   increment = section.replace(archive, binary, alignment)
   next_sections = next_section_by_pointer_of section
   next_sections.each{ |next_section|
!    next_section.move_pointer!(increment[0])
   }
   next_sections = next_section_by_address_of section
   next_sections.each{ |next_section|
!    next_section.move_address!(increment[1])
   }
        end

        def section_named(section_name)
--- 710,722 ----
          increment = section.replace(archive, binary, alignment)
          next_sections = next_section_by_pointer_of section
          next_sections.each{ |next_section|
!           next_section.move_pointer!(increment.gain_of_raw_data)
          }
          next_sections = next_section_by_address_of section
          next_sections.each{ |next_section|
!           next_section.move_address!(increment.gain_of_virtual_size)
          }
+         return increment
        end

        def section_named(section_name)
***************
*** 706,719 ****
        def pack_bodies_to(binary)
        end

-       def packed_headers
-  packed = ''
-  @sections.each{ |section|
-    packed.concat section.header.pack
-  }
-  return packed
-       end
-
        def packed_bodies
   sorted =****@secti*****{ |x, y| x.header.pinter_to_raw_data - y.header.pointer_to_raw_data }
   packed = ''
--- 734,739 ----
***************
*** 739,770 ****
        #================================================================#
        # a header of Section
        class Header
!  attr_accessor :name, :pointer_to_raw_data, :size_of_raw_data, :virtual_size, :virtual_address
   def initialize(core, offset)
!    @name = core[offset, 8]
!    @virtual_size = core[offset + 8, 4].unpack('L')[0]
!    @virtual_address = core[offset + 12, 4].unpack('L')[0]
!    @size_of_raw_data = core[offset + 16, 4].unpack('L')[0]
!    @pointer_to_raw_data = core[offset + 20, 4].unpack('L')[0]
!    @pointer_to_relocations = core[offset + 24, 4].unpack('L')[0]
!    @pointer_to_line_numbers = core[offset + 28, 4].unpack('L')[0]
!    @number_of_relocations = core[offset + 32, 2].unpack('S')[0]
!    @number_of_line_numbers = core[offset + 34, 2].unpack('S')[0]
!    @characteristics = core[offset + 36, 4].unpack('L')[0]
   end

!  def pack
!    packed = @name
!    packed.concat [@virtual_size].pack('L')
!    packed.concat [@virtual_address].pack('L')
!    packed.concat [@size_of_raw_data].pack('L')
!    packed.concat [@pointer_to_raw_data].pack('L')
!    packed.concat [@pointer_to_relocations].pack('L')
!    packed.concat [@pointer_to_line_numbers].pack('L')
!    packed.concat [@number_of_relocations].pack('S')
!    packed.concat [@number_of_line_numbers].pack('S')
!    packed.concat [@characteristics].pack('L')
!    return packed
   end
        end

--- 759,805 ----
        #================================================================#
        # a header of Section
        class Header
!         include BinaryAccess
!
          def initialize(core, offset)
!           @core = core
!           @offset = offset
          end

!         def name
!           @core[@offset, 8]
!         end
!
!         def pointer_to_raw_data
!           get(@offset + 20, 4, 'L')
!         end
!
!         def pointer_to_raw_data=(number)
!           put(@offset + 20, 4, 'L', number)
!         end
!
!         def size_of_raw_data
!           get(@offset + 16, 4, 'L')
!         end
!
!         def size_of_raw_data=(number)
!           put(@offset + 16, 4, 'L', number)
!         end
!
!         def virtual_size
!           get(@offset + 8, 4, 'L')
!         end
!
!         def virtual_size=(number)
!           put(@offset + 8, 4, 'L', number)
!         end
!
!         def virtual_address
!           get(@offset + 12, 4, 'L')
!         end
!
!         def virtual_address=(number)
!           put(@offset + 12, 4, 'L', number)
          end
        end

***************
*** 791,797 ****
   if increment > 0
     @header.size_of_raw_data = aligned_size
   end
!  return [increment, self.aligned_size(new_size - old_size, alignment)]
        end

        def move_pointer!(distance)
--- 826,832 ----
          if increment > 0
            @header.size_of_raw_data = aligned_size
          end
!         return ReplaceResult.new(increment, self.aligned_size(new_size - old_size, alignment))
        end

        def move_pointer!(distance)
diff -rcw ./rb2exe/rb2exe.cpp ../exerb/rb2exe/rb2exe.cpp
*** ./rb2exe/rb2exe.cpp Sat May 18 16:30:30 2002
--- ../exerb/rb2exe/rb2exe.cpp Wed May 15 22:29:32 2002
***************
*** 179,191 ****
  {
   // アーカイブヘッダのオフセットとサイズをチェック
   g_pDOSHeader = (PR2E_DOS_HEADER)g_dwFileBase;
!  if ( !g_pDOSHeader->OffsetToArchive || !g_pDOSHeader->SizeOfArchive ) {
!   ::r2e_error_message("アーカイブヘッダが見つかりません。アーカイブを結合していないコアを実行しようとしている可能性があります。");
!   return false;
!  }

   // アーカイブ内のスクリプト数をチェック
!  g_pArchive = (PR2E_ARCHIVE_HEADER)(g_dwFileBase + g_pDOSHeader->OffsetToArchive);
   if ( g_pArchive->NumberOfScript == 0 ) {
    ::r2e_error_message("実行するスクリプトが見つかりません。アーカイブ内には最低1つのスクリプトが必要です。");
    return false;
--- 179,191 ----
  {
   // アーカイブヘッダのオフセットとサイズをチェック
   g_pDOSHeader = (PR2E_DOS_HEADER)g_dwFileBase;
! // if ( !g_pDOSHeader->OffsetToArchive || !g_pDOSHeader->SizeOfArchive ) {
! //  ::r2e_error_message("アーカイブヘッダが見つかりません。アーカイブを結合していないコアを実行しようとしている可能性があります。
");
! //  return false;
! // }

   // アーカイブ内のスクリプト数をチェック
!  g_pArchive = &ArchiveHeader;//(PR2E_ARCHIVE_HEADER)(g_dwFileBase + g_pDOSHeader->OffsetToArchive);
   if ( g_pArchive->NumberOfScript == 0 ) {
    ::r2e_error_message("実行するスクリプトが見つかりません。アーカイブ内には最低1つのスクリプトが必要です。");
    return false;





exerb-developer メーリングリストの案内
Back to archive index