fpc/compiler/systems/i_linux.pas
peter 66f8276445 * refactor booleans in systeminfo structure, they are now flags
* support for case aware filesystems (Windows), they do now only
    one lookup if a file exists
  * add -WI option to generate import section for DLL imports or
    let the linker handle it. Default is still import section until
    the Makefiles are fixed, then the generation can be left to the
    linker

git-svn-id: trunk@2274 -
2006-01-13 15:13:26 +00:00

627 lines
21 KiB
ObjectPascal

{
Copyright (c) 1998-2002 by Peter Vreman
This unit implements support information structures for linux
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
****************************************************************************
}
{ This unit implements support information structures for linux. }
unit i_linux;
interface
uses
systems;
const
res_elf32_info : tresinfo =
(
id : res_elf;
resbin : 'fpcres';
rescmd : '-o $OBJ -i $RES'
);
res_elf64_info : tresinfo =
(
id : res_elf;
resbin : 'fpcres';
rescmd : '-o $OBJ -i $RES'
);
system_i386_linux_info : tsysteminfo =
(
system : system_i386_LINUX;
name : 'Linux for i386';
shortname : 'Linux';
flags : [tf_needs_symbol_size,tf_pic_uses_got{,tf_smartlink_sections},
{$ifdef segment_threadvars}
tf_section_threadvars,
{$endif segment_threadvars}
tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
cpu : cpu_i386;
unit_env : 'LINUXUNITS';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_i386_elf32;
assemextern : as_gas;
link : nil;
linkextern : nil;
ar : ar_gnu_ar;
res : res_elf;
dbg : dbg_stabs;
script : script_unix;
endian : endian_little;
alignment :
(
procalign : 16;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 8;
varalignmin : 0;
varalignmax : 16;
localalignmin : 4;
localalignmax : 8;
recordalignmin : 0;
recordalignmax : 16;
maxCrecordalign : 4
);
first_parm_offset : 8;
stacksize : 262144;
abi : abi_default
);
system_x86_6432_linux_info : tsysteminfo =
(
system : system_x86_6432_LINUX;
name : 'Linux for x64_6432';
shortname : 'Linux6432';
flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses,tf_pic_uses_got{,tf_smartlink_sections}];
cpu : cpu_x86_64;
unit_env : 'LINUXUNITS';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_i386_elf32;
assemextern : as_gas;
link : nil;
linkextern : nil;
ar : ar_gnu_ar;
res : res_none;
dbg : dbg_stabs;
script : script_unix;
endian : endian_little;
alignment :
(
procalign : 16;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 16;
varalignmin : 0;
varalignmax : 16;
localalignmin : 4;
localalignmax : 8;
recordalignmin : 0;
recordalignmax : 16;
maxCrecordalign : 4
);
first_parm_offset : 8;
stacksize : 262144;
abi : abi_default
);
system_m68k_linux_info : tsysteminfo =
(
system : system_m68k_linux;
name : 'Linux for m68k';
shortname : 'Linux';
flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
cpu : cpu_m68k;
unit_env : 'LINUXUNITS';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_gas;
assemextern : as_gas;
link : nil;
linkextern : nil;
ar : ar_gnu_ar;
res : res_none;
dbg : dbg_stabs;
script : script_unix;
endian : endian_big;
alignment :
(
procalign : 4;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 4;
varalignmin : 0;
varalignmax : 4;
localalignmin : 4;
localalignmax : 4;
recordalignmin : 0;
recordalignmax : 2;
maxCrecordalign : 4
);
first_parm_offset : 8;
stacksize : 32*1024*1024;
abi : abi_default
);
system_powerpc_linux_info : tsysteminfo =
(
system : system_powerpc_LINUX;
name : 'Linux for PowerPC';
shortname : 'Linux';
flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
cpu : cpu_powerpc;
unit_env : '';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_gas;
assemextern : as_gas;
link : nil;
linkextern : nil;
ar : ar_gnu_ar;
res : res_none;
dbg : dbg_stabs;
script : script_unix;
endian : endian_big;
alignment :
(
procalign : 4;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 4;
varalignmin : 0;
varalignmax : 4;
localalignmin : 4;
localalignmax : 4;
recordalignmin : 0;
recordalignmax : 4;
maxCrecordalign : 8
);
first_parm_offset : 8;
stacksize : 32*1024*1024;
abi : abi_powerpc_sysv;
);
system_powerpc64_linux_info : tsysteminfo =
(
system : system_powerpc64_LINUX;
name : 'Linux for PowerPC64';
shortname : 'Linux';
flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
cpu : cpu_powerpc64;
unit_env : '';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_gas;
assemextern : as_gas;
link : nil;
linkextern : nil;
ar : ar_gnu_ar;
res : res_none;
dbg : dbg_stabs;
script : script_unix;
endian : endian_big;
alignment :
(
procalign : 8;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 8;
varalignmin : 0;
varalignmax : 8;
localalignmin : 4;
localalignmax : 8;
recordalignmin : 0;
recordalignmax : 8;
maxCrecordalign : 8
);
first_parm_offset : 8;
stacksize : 10*1024*1024;
abi : abi_default
);
system_alpha_linux_info : tsysteminfo =
(
system : system_alpha_LINUX;
name : 'Linux for Alpha';
shortname : 'Linux';
flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
cpu : cpu_alpha;
unit_env : 'LINUXUNITS';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_gas;
assemextern : as_gas;
link : nil;
linkextern : nil;
ar : ar_gnu_ar;
res : res_none;
dbg : dbg_stabs;
script : script_unix;
endian : endian_little;
alignment :
(
procalign : 4;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 4;
varalignmin : 0;
varalignmax : 4;
localalignmin : 4;
localalignmax : 4;
recordalignmin : 0;
recordalignmax : 2;
maxCrecordalign : 4
);
first_parm_offset : 8;
stacksize : 32*1024*1024;
abi : abi_default
);
system_x86_64_linux_info : tsysteminfo =
(
system : system_x86_64_LINUX;
name : 'Linux for x86-64';
shortname : 'Linux';
flags : [tf_needs_symbol_size,tf_needs_dwarf_cfi,
tf_library_needs_pic,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
cpu : cpu_x86_64;
unit_env : 'LINUXUNITS';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_gas;
assemextern : as_gas;
link : nil;
linkextern : nil;
ar : ar_gnu_ar;
res : res_none;
dbg : dbg_stabs;
script : script_unix;
endian : endian_little;
alignment :
(
procalign : 8;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 8;
varalignmin : 0;
varalignmax : 16;
localalignmin : 4;
localalignmax : 16;
recordalignmin : 0;
recordalignmax : 16;
maxCrecordalign : 8
);
first_parm_offset : 16;
stacksize : 256*1024;
abi : abi_default
);
system_sparc_linux_info : tsysteminfo =
(
system : system_SPARC_Linux;
name : 'Linux for SPARC';
shortname : 'Linux';
flags : [tf_needs_symbol_size,tf_library_needs_pic,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
cpu : cpu_SPARC;
unit_env : 'LINUXUNITS';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_gas;
assemextern : as_gas;
link : nil;
linkextern : nil;
ar : ar_gnu_ar;
res : res_none;
dbg : dbg_stabs;
script : script_unix;
endian : endian_big;
alignment :
(
procalign : 4;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 8;
varalignmin : 0;
varalignmax : 8;
localalignmin : 4;
localalignmax : 8;
recordalignmin : 0;
recordalignmax : 8;
maxCrecordalign : 8
);
first_parm_offset : 92;
stacksize : 262144;
abi : abi_default
);
system_arm_linux_info : tsysteminfo =
(
system : system_arm_Linux;
name : 'Linux for ARM';
shortname : 'Linux';
flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
cpu : cpu_arm;
unit_env : 'LINUXUNITS';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_gas;
assemextern : as_gas;
link : nil;
linkextern : nil;
ar : ar_gnu_ar;
res : res_none;
dbg : dbg_stabs;
script : script_unix;
endian : endian_little;
alignment :
(
procalign : 4;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 4;
varalignmin : 0;
varalignmax : 4;
localalignmin : 4;
localalignmax : 8;
recordalignmin : 0;
recordalignmax : 4;
maxCrecordalign : 4
);
first_parm_offset : 8;
stacksize : 262144;
abi : abi_default
);
implementation
initialization
{$ifdef CPU86}
{$ifdef linux}
{ some FreeBSD versions define linux as well }
{$ifndef FreeBSD}
set_source_info(system_i386_linux_info);
{$endif FreeBSD}
{$endif}
{$endif CPU86}
{$ifdef CPU68}
{$ifdef linux}
set_source_info(system_m68k_linux_info);
{$endif linux}
{$endif CPU68}
{$ifdef CPUX86_64}
{$ifdef linux}
set_source_info(system_x86_64_linux_info);
{$endif linux}
{$endif CPUX86_64}
{$ifdef CPUALPHA}
{$ifdef linux}
set_source_info(system_alpha_linux_info);
{$endif linux}
{$endif CPUALPHA}
{$ifdef CPUSPARC}
{$ifdef linux}
set_source_info(system_sparc_linux_info);
{$endif linux}
{$endif CPUSPARC}
{$ifdef CPUPOWERPC32}
{$ifdef linux}
set_source_info(system_powerpc_linux_info);
{$endif linux}
{$endif CPUPOWERPC32}
{$ifdef CPUPOWERPC64}
{$ifdef linux}
set_source_info(system_powerpc64_linux_info);
{$endif linux}
{$endif CPUPOWERPC64}
{$ifdef CPUARM}
{$ifdef linux}
set_source_info(system_arm_linux_info);
{$endif linux}
{$endif CPUARM}
end.