mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 15:39:24 +01:00 
			
		
		
		
	* section "fpc" was renamed to ".fpc".
* compiler version string is stored in .fpc.version section. * debug start/end links are stored in .fpc.links section. * fixed linking with eVC++ object files by internal linker. * .fpc.links section is removed by internal linker before writing executable, because it is no longer needed. git-svn-id: trunk@5305 -
This commit is contained in:
		
							parent
							
								
									677defd615
								
							
						
					
					
						commit
						5f484a0f14
					
				@ -258,7 +258,7 @@ implementation
 | 
			
		||||
          '.idata$2','.idata$4','.idata$5','.idata$6','.idata$7','.edata',
 | 
			
		||||
          '.eh_frame',
 | 
			
		||||
          '.debug_frame','.debug_info','.debug_line','.debug_abbrev',
 | 
			
		||||
          'fpc.resptrs',
 | 
			
		||||
          '.fpc',
 | 
			
		||||
          '.toc'
 | 
			
		||||
        );
 | 
			
		||||
        secnames_pic : array[TAsmSectiontype] of string[17] = ('',
 | 
			
		||||
@ -274,7 +274,7 @@ implementation
 | 
			
		||||
          '.idata$2','.idata$4','.idata$5','.idata$6','.idata$7','.edata',
 | 
			
		||||
          '.eh_frame',
 | 
			
		||||
          '.debug_frame','.debug_info','.debug_line','.debug_abbrev',
 | 
			
		||||
          'fpc.resptrs',
 | 
			
		||||
          '.fpc',
 | 
			
		||||
          '.toc'
 | 
			
		||||
        );
 | 
			
		||||
      var
 | 
			
		||||
@ -287,6 +287,12 @@ implementation
 | 
			
		||||
        else
 | 
			
		||||
          secname:=secnames[atype];
 | 
			
		||||
          
 | 
			
		||||
        if (atype=sec_fpc) and (Copy(aname,1,3)='res') then
 | 
			
		||||
          begin
 | 
			
		||||
            result:=secname+'.'+aname;
 | 
			
		||||
            exit;
 | 
			
		||||
          end;
 | 
			
		||||
 | 
			
		||||
        if (atype=sec_threadvar) and
 | 
			
		||||
          (target_info.system=system_i386_win32) then
 | 
			
		||||
          secname:='.tls';
 | 
			
		||||
@ -336,6 +342,7 @@ implementation
 | 
			
		||||
        AsmWrite(s);
 | 
			
		||||
        case atype of
 | 
			
		||||
          sec_fpc :
 | 
			
		||||
            if aname = 'resptrs' then
 | 
			
		||||
              AsmWrite(', "a", @progbits');
 | 
			
		||||
          sec_stub :
 | 
			
		||||
            begin
 | 
			
		||||
 | 
			
		||||
@ -1529,10 +1529,10 @@ implementation
 | 
			
		||||
        hp : tmodule;
 | 
			
		||||
        dbgtable : tai_symbol;
 | 
			
		||||
      begin
 | 
			
		||||
        { Reference all DEBUGINFO sections from the main .text section }
 | 
			
		||||
        { Reference all DEBUGINFO sections from the main .fpc section }
 | 
			
		||||
        if (target_info.system=system_powerpc_macos) then
 | 
			
		||||
          exit;
 | 
			
		||||
        list.concat(Tai_section.create(sec_data,'',0));
 | 
			
		||||
        list.concat(Tai_section.create(sec_fpc,'links',0));
 | 
			
		||||
        { make sure the debuginfo doesn't get stripped out }
 | 
			
		||||
        if (target_info.system in [system_powerpc_darwin,system_i386_darwin]) then
 | 
			
		||||
          begin
 | 
			
		||||
 | 
			
		||||
@ -233,7 +233,7 @@ interface
 | 
			
		||||
       function  sectiontype2options(atype:TAsmSectiontype):TObjSectionOptions;virtual;
 | 
			
		||||
       function  sectiontype2align(atype:TAsmSectiontype):shortint;virtual;
 | 
			
		||||
       function  createsection(atype:TAsmSectionType;const aname:string='';aorder:TAsmSectionOrder=secorder_default):TObjSection;
 | 
			
		||||
       function  createsection(const aname:string;aalign:shortint;aoptions:TObjSectionOptions):TObjSection;virtual;
 | 
			
		||||
       function  createsection(const aname:string;aalign:shortint;aoptions:TObjSectionOptions;DiscardDuplicate:boolean=true):TObjSection;virtual;
 | 
			
		||||
       procedure CreateDebugSections;virtual;
 | 
			
		||||
       function  findsection(const aname:string):TObjSection;
 | 
			
		||||
       procedure setsection(asec:TObjSection);
 | 
			
		||||
@ -873,9 +873,12 @@ implementation
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    function TObjData.createsection(const aname:string;aalign:shortint;aoptions:TObjSectionOptions):TObjSection;
 | 
			
		||||
    function TObjData.createsection(const aname:string;aalign:shortint;aoptions:TObjSectionOptions;DiscardDuplicate:boolean):TObjSection;
 | 
			
		||||
      begin
 | 
			
		||||
        result:=TObjSection(FObjSectionList.Find(aname));
 | 
			
		||||
        if DiscardDuplicate then
 | 
			
		||||
          result:=TObjSection(FObjSectionList.Find(aname))
 | 
			
		||||
        else
 | 
			
		||||
          result:=nil;
 | 
			
		||||
        if not assigned(result) then
 | 
			
		||||
          begin
 | 
			
		||||
            result:=CObjSection.create(FObjSectionList,aname,aalign,aoptions);
 | 
			
		||||
@ -2316,7 +2319,11 @@ implementation
 | 
			
		||||
                if oso_debug in objsec.secoptions then
 | 
			
		||||
                  objsec.Used:=true;
 | 
			
		||||
                if (oso_keep in objsec.secoptions) then
 | 
			
		||||
                  begin
 | 
			
		||||
                    AddToObjSectionWorkList(objsec);
 | 
			
		||||
                    if objsec.name='.fpc.n_links' then
 | 
			
		||||
                      objsec.Used:=false;
 | 
			
		||||
                  end;
 | 
			
		||||
              end;
 | 
			
		||||
          end;
 | 
			
		||||
        AddToObjSectionWorkList(entrysym.exesymbol.objsymbol.objsection);
 | 
			
		||||
 | 
			
		||||
@ -1795,9 +1795,10 @@ const pemagic : array[0..3] of byte = (
 | 
			
		||||
               if (Copy(secname,1,6)='.idata') or
 | 
			
		||||
                  (Copy(secname,1,6)='.edata') or
 | 
			
		||||
                  (Copy(secname,1,5)='.rsrc') or
 | 
			
		||||
                  (Copy(secname,1,6)='.pdata') then
 | 
			
		||||
                  (Copy(secname,1,6)='.pdata') or
 | 
			
		||||
                  (Copy(secname,1,4)='.fpc') then
 | 
			
		||||
                 include(secoptions,oso_keep);
 | 
			
		||||
               objsec:=TCoffObjSection(createsection(secname,secalign,secoptions));
 | 
			
		||||
               objsec:=TCoffObjSection(createsection(secname,secalign,secoptions,false));
 | 
			
		||||
               FSecTbl^[i]:=objsec;
 | 
			
		||||
               if not win32 then
 | 
			
		||||
                 objsec.mempos:=sechdr.rvaofs;
 | 
			
		||||
 | 
			
		||||
@ -378,8 +378,8 @@ implementation
 | 
			
		||||
{$ENDIF POWERPC}
 | 
			
		||||
      begin
 | 
			
		||||
        maybe_new_object_file(current_asmdata.asmlists[al_globals]);
 | 
			
		||||
        { Insert Ident of the compiler in the main .data section }
 | 
			
		||||
        current_asmdata.asmlists[al_globals].concat(Tai_section.create(sec_data,'',0));
 | 
			
		||||
        { Insert Ident of the compiler in the .fpc.version section }
 | 
			
		||||
        current_asmdata.asmlists[al_globals].concat(Tai_section.create(sec_fpc,'version',0));
 | 
			
		||||
        current_asmdata.asmlists[al_globals].concat(Tai_align.Create(const_align(32)));
 | 
			
		||||
        current_asmdata.asmlists[al_globals].concat(Tai_string.Create('FPC '+full_version_string+
 | 
			
		||||
          ' ['+date_string+'] for '+target_cpu_string+' - '+target_info.shortname));
 | 
			
		||||
@ -1451,7 +1451,7 @@ implementation
 | 
			
		||||
         if islibrary or (target_info.system in system_unit_program_exports) then
 | 
			
		||||
           exportlib.generatelib;
 | 
			
		||||
 | 
			
		||||
         { Reference all DEBUGINFO sections from the main .text section }
 | 
			
		||||
         { Reference all DEBUGINFO sections from the main .fpc section }
 | 
			
		||||
         if (cs_debuginfo in current_settings.moduleswitches) then
 | 
			
		||||
           debuginfo.referencesections(current_asmdata.asmlists[al_procedures]);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -366,6 +366,7 @@ begin
 | 
			
		||||
      add('*(.data)');
 | 
			
		||||
      add('*(.data.*)');
 | 
			
		||||
      add('*(.gnu.linkonce.d*)');
 | 
			
		||||
      add('*(.fpc*)');
 | 
			
		||||
      add('CONSTRUCTORS');
 | 
			
		||||
      add('. = ALIGN(4);');
 | 
			
		||||
      add('} >iwram = 0xff');
 | 
			
		||||
 | 
			
		||||
@ -190,6 +190,7 @@ begin
 | 
			
		||||
  ScriptRes.Add('      *(.dtor)');
 | 
			
		||||
  ScriptRes.Add('      djgpp_last_dtor = . ;');
 | 
			
		||||
  ScriptRes.Add('      *(.data)');
 | 
			
		||||
  ScriptRes.Add('      *(.fpc*)');
 | 
			
		||||
  ScriptRes.Add('      *(.gcc_exc)');
 | 
			
		||||
  ScriptRes.Add('      ___EH_FRAME_BEGIN__ = . ;');
 | 
			
		||||
  ScriptRes.Add('      *(.eh_fram)');
 | 
			
		||||
 | 
			
		||||
@ -574,6 +574,7 @@ begin
 | 
			
		||||
      add('  .data           :');
 | 
			
		||||
      add('  {');
 | 
			
		||||
      add('    *(.data .data.* .gnu.linkonce.d.*)');
 | 
			
		||||
      add('    KEEP (*(.fpc .fpc.version .fpc.links))');
 | 
			
		||||
      add('    KEEP (*(.gnu.linkonce.d.*personality*))');
 | 
			
		||||
      add('  }');
 | 
			
		||||
      add('  _edata = .;');
 | 
			
		||||
 | 
			
		||||
@ -958,6 +958,7 @@ implementation
 | 
			
		||||
            Concat('EXESECTION .data');
 | 
			
		||||
            Concat('  SYMBOL __data_start__');
 | 
			
		||||
            Concat('  OBJSECTION .data*');
 | 
			
		||||
            Concat('  OBJSECTION .fpc*');
 | 
			
		||||
            Concat('  SYMBOL edata');
 | 
			
		||||
            Concat('  SYMBOL __data_end__');
 | 
			
		||||
            Concat('ENDEXESECTION');
 | 
			
		||||
@ -1158,7 +1159,7 @@ implementation
 | 
			
		||||
            Add('  .data BLOCK(__section_alignment__) :');
 | 
			
		||||
            Add('  {');
 | 
			
		||||
            Add('    __data_start__ = . ;');
 | 
			
		||||
            add('    *(.data .data.* .gnu.linkonce.d.*)');
 | 
			
		||||
            add('    *(.data .data.* .gnu.linkonce.d.* .fpc*)');
 | 
			
		||||
            Add('    *(.data2)');
 | 
			
		||||
            Add('    *(SORT(.data$*))');
 | 
			
		||||
            Add('    __data_end__ = . ;');
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ though.
 | 
			
		||||
 | 
			
		||||
Format used for the various resource sections:
 | 
			
		||||
 | 
			
		||||
 fpc.resptrs:   This section is contained in resptrs.o and always linked to the executable by
 | 
			
		||||
 .fpc.resptrs:  This section is contained in resptrs.o and always linked to the executable by
 | 
			
		||||
                FPC. It containes an exported label fpcrespointers, which is used at runtime
 | 
			
		||||
                to find the resptrs section in memory. The resptrs contains pointers to all the
 | 
			
		||||
                sections and their sizes. These are updated in a post-precessing step by the
 | 
			
		||||
@ -38,15 +38,15 @@ Format used for the various resource sections:
 | 
			
		||||
                The second integer (32/64 Bit) value in this section contains the number of
 | 
			
		||||
                resources.
 | 
			
		||||
                After this follows a version-defined number of TFPCResourceSectionInfo entries.
 | 
			
		||||
 fpc.ressym:    Contains the resource names. This simply is a stream of zero-terminated strings.
 | 
			
		||||
 .fpc.ressym:   Contains the resource names. This simply is a stream of zero-terminated strings.
 | 
			
		||||
                Only textual names are supported, numeric IDs get autoconverted to #ID's.
 | 
			
		||||
                The reshash table has got a byte index into ressym to quickly get that data if needed
 | 
			
		||||
 fpc.reshash:   n TFPCResourceInfo records. (number of entries is defined in fpc.resptrs)
 | 
			
		||||
 fpc.resdata:   Contains the plain resource data stream. A byte index into the data stream
 | 
			
		||||
 .fpc.reshash:  n TFPCResourceInfo records. (number of entries is defined in fpc.resptrs)
 | 
			
		||||
 .fpc.resdata:  Contains the plain resource data stream. A byte index into the data stream
 | 
			
		||||
                is given for each resource entry in TResourceInfo
 | 
			
		||||
 fpc.resspare:  An empty section which is resized to make room if the size of any of the previous
 | 
			
		||||
 .fpc.resspare: An empty section which is resized to make room if the size of any of the previous
 | 
			
		||||
                sections gets changed. NOT USED IN VERSION 1 (SIZE WILL BE 0)
 | 
			
		||||
 fpc.resstr:    This section is completely seperated from the rest and contains a block of
 | 
			
		||||
 .fpc.resstr:   This section is completely seperated from the rest and contains a block of
 | 
			
		||||
                resourcestrings in internal FPC format.
 | 
			
		||||
 | 
			
		||||
resptr TFPCResourceSectionInfo list for FPC resources version 1:
 | 
			
		||||
@ -78,8 +78,8 @@ const fpcres2elf_version=1;
 | 
			
		||||
 | 
			
		||||
// Do not change the following consts, they are dummy tables to generate an .o that makes ld happy
 | 
			
		||||
const shstrtab = #0+'.symtab'+#0+'.strtab'+#0+'.shstrtab'+#0+'.text'+#0+'.data'+#0+
 | 
			
		||||
                 '.bss'+#0+'fpc.ressym'+#0+'fpc.resstr'+#0+'fpc.reshash'+#0+
 | 
			
		||||
                 'fpc.resdata'+#0+'fpc.resspare'+#0+#0;
 | 
			
		||||
                 '.bss'+#0+'.fpc.ressym'+#0+'.fpc.resstr'+#0+'.fpc.reshash'+#0+
 | 
			
		||||
                 '.fpc.resdata'+#0+'.fpc.resspare'+#0+#0;
 | 
			
		||||
      symtab =   #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00+
 | 
			
		||||
                 #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$03#$00#$01#$00+
 | 
			
		||||
                 #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$03#$00#$02#$00+
 | 
			
		||||
@ -545,7 +545,7 @@ begin
 | 
			
		||||
  SectionHeader.sh_entsize:=0;
 | 
			
		||||
  FSectionStream.Write(SectionHeader,sizeOf(SectionHeader));
 | 
			
		||||
 | 
			
		||||
  // fpc.ressym
 | 
			
		||||
  // .fpc.ressym
 | 
			
		||||
  SectionHeader.sh_name:=$2C;
 | 
			
		||||
  SectionHeader.sh_type:=1; // PROGBITS
 | 
			
		||||
  SectionHeader.sh_flags:=2; // A
 | 
			
		||||
@ -558,8 +558,8 @@ begin
 | 
			
		||||
  SectionHeader.sh_entsize:=0;
 | 
			
		||||
  FSectionStream.Write(SectionHeader,sizeOf(SectionHeader));
 | 
			
		||||
 | 
			
		||||
  // fpc.resstr
 | 
			
		||||
  SectionHeader.sh_name:=$37;
 | 
			
		||||
  // .fpc.resstr
 | 
			
		||||
  SectionHeader.sh_name:=$38;
 | 
			
		||||
  SectionHeader.sh_type:=1; // PROGBITS
 | 
			
		||||
  SectionHeader.sh_flags:=2; // A
 | 
			
		||||
  SectionHeader.sh_addr:=0;
 | 
			
		||||
@ -571,8 +571,8 @@ begin
 | 
			
		||||
  SectionHeader.sh_entsize:=0;
 | 
			
		||||
  FSectionStream.Write(SectionHeader,sizeOf(SectionHeader));
 | 
			
		||||
 | 
			
		||||
  // fpc.reshash
 | 
			
		||||
  SectionHeader.sh_name:=$42;
 | 
			
		||||
  // .fpc.reshash
 | 
			
		||||
  SectionHeader.sh_name:=$44;
 | 
			
		||||
  SectionHeader.sh_type:=1; // PROGBITS
 | 
			
		||||
  SectionHeader.sh_flags:=2; // A
 | 
			
		||||
  SectionHeader.sh_addr:=0;
 | 
			
		||||
@ -584,8 +584,8 @@ begin
 | 
			
		||||
  SectionHeader.sh_entsize:=0;
 | 
			
		||||
  FSectionStream.Write(SectionHeader,sizeOf(SectionHeader));
 | 
			
		||||
 | 
			
		||||
  // fpc.resdata
 | 
			
		||||
  SectionHeader.sh_name:=$4e;
 | 
			
		||||
  // .fpc.resdata
 | 
			
		||||
  SectionHeader.sh_name:=$51;
 | 
			
		||||
  SectionHeader.sh_type:=1; // PROGBITS
 | 
			
		||||
  SectionHeader.sh_flags:=2; // A
 | 
			
		||||
  SectionHeader.sh_addr:=0;
 | 
			
		||||
@ -597,9 +597,9 @@ begin
 | 
			
		||||
  SectionHeader.sh_entsize:=0;
 | 
			
		||||
  FSectionStream.Write(SectionHeader,sizeOf(SectionHeader));
 | 
			
		||||
 | 
			
		||||
  // fpc.resspare
 | 
			
		||||
  // .fpc.resspare
 | 
			
		||||
  // Not used in V1
 | 
			
		||||
  SectionHeader.sh_name:=$5a;
 | 
			
		||||
  SectionHeader.sh_name:=$5f;
 | 
			
		||||
  SectionHeader.sh_type:=8; // NOBITS
 | 
			
		||||
  SectionHeader.sh_flags:=2; // A
 | 
			
		||||
  SectionHeader.sh_addr:=0;
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
{ *********************************************************************** }
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
This tool will update the fpc.resptrs section of an ELF executable to point
 | 
			
		||||
This tool will update the .fpc.resptrs section of an ELF executable to point
 | 
			
		||||
to the various resource sections in the file. This is done so that the FPC
 | 
			
		||||
RTL at runtime is able to get pointers to these sections.
 | 
			
		||||
 | 
			
		||||
@ -206,12 +206,12 @@ begin
 | 
			
		||||
    SectionName:=copy(strtab,SectionHeaders[i].sh_name+1,32);
 | 
			
		||||
    SectionName:=copy(SectionName,1,pos(#0,SectionName)-1);
 | 
			
		||||
    DoVerbose(SProcessingSection+SectionName);
 | 
			
		||||
    sn:=Copy(SectionName,1,4);
 | 
			
		||||
    sn:=Copy(SectionName,1,5);
 | 
			
		||||
    // FPC section ?
 | 
			
		||||
    if (sn='fpc.') then
 | 
			
		||||
    if (sn='.fpc.') then
 | 
			
		||||
      begin
 | 
			
		||||
      sn:=SectionName;
 | 
			
		||||
      Delete(SN,1,4);
 | 
			
		||||
      Delete(SN,1,5);
 | 
			
		||||
      if SN='resptrs' then
 | 
			
		||||
        begin
 | 
			
		||||
        ResPtrsSection:=i;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user