瀏覽代碼

--- Merging r19241 into '.':
U rtl/freebsd/termiosproc.inc
--- Merging r19242 into '.':
U compiler/systems/t_bsd.pas
--- Merging r19265 into '.':
A tests/test/cg/obj/freebsd/x86_64/cpptcl1.o
A tests/test/cg/obj/freebsd/x86_64/cpptcl2.o
A tests/test/cg/obj/freebsd/x86_64/tcext6.o
C tests/test/cg/obj/readme.txt
--- Merging r19276 into '.':
U rtl/freebsd/Makefile.fpc
A rtl/freebsd/i386/dllprt0.as
A rtl/freebsd/x86_64/dllprt0.as
U rtl/freebsd/Makefile
--- Merging r19608 into '.':
U compiler/ogelf.pas
U compiler/systems/i_bsd.pas
Summary of conflicts:
Text conflicts: 1

# revisions: 19241,19242,19265,19276,19608
------------------------------------------------------------------------
r19241 | pierre | 2011-09-26 12:24:00 +0200 (Mon, 26 Sep 2011) | 1 line
Changed paths:
M /trunk/rtl/freebsd/termiosproc.inc

Suppress console messages about sign extension in ioctl system call
------------------------------------------------------------------------
------------------------------------------------------------------------
r19242 | pierre | 2011-09-26 12:25:27 +0200 (Mon, 26 Sep 2011) | 1 line
Changed paths:
M /trunk/compiler/systems/t_bsd.pas

Try to support shared libraries for freebsd
------------------------------------------------------------------------
------------------------------------------------------------------------
r19265 | pierre | 2011-09-28 17:13:54 +0200 (Wed, 28 Sep 2011) | 1 line
Changed paths:
A /trunk/tests/test/cg/obj/freebsd/x86_64/cpptcl1.o
A /trunk/tests/test/cg/obj/freebsd/x86_64/cpptcl2.o
A /trunk/tests/test/cg/obj/freebsd/x86_64/tcext6.o
M /trunk/tests/test/cg/obj/readme.txt

Missing freebsd x86_64 objects added
------------------------------------------------------------------------
------------------------------------------------------------------------
r19276 | pierre | 2011-09-29 01:07:39 +0200 (Thu, 29 Sep 2011) | 1 line
Changed paths:
M /trunk/rtl/freebsd/Makefile
M /trunk/rtl/freebsd/Makefile.fpc
A /trunk/rtl/freebsd/i386/dllprt0.as
A /trunk/rtl/freebsd/x86_64/dllprt0.as

* Shared library dllrpt0.as init code for i386 and x86_64 CPUs
------------------------------------------------------------------------
------------------------------------------------------------------------
r19608 | pierre | 2011-11-08 15:05:57 +0100 (Tue, 08 Nov 2011) | 1 line
Changed paths:
M /trunk/compiler/ogelf.pas
M /trunk/compiler/systems/i_bsd.pas

* Enable internal elf writer for freebsd x86_64 target
------------------------------------------------------------------------

git-svn-id: branches/fixes_2_6@20147 -

marco 13 年之前
父節點
當前提交
a6ac440f91

+ 5 - 0
.gitattributes

@@ -7101,6 +7101,7 @@ rtl/freebsd/errnostr.inc svneol=native#text/plain
 rtl/freebsd/freebsd.pas -text svneol=unset#text/plain
 rtl/freebsd/i386/bsyscall.inc svneol=native#text/plain
 rtl/freebsd/i386/cprt0.as svneol=native#text/plain
+rtl/freebsd/i386/dllprt0.as svneol=native#text/plain
 rtl/freebsd/i386/gprt0.as svneol=native#text/plain
 rtl/freebsd/i386/identpatch.sh svneol=native#text/plain
 rtl/freebsd/i386/prt0.as svneol=native#text/plain
@@ -7128,6 +7129,7 @@ rtl/freebsd/unxsockh.inc svneol=native#text/plain
 rtl/freebsd/unxsysc.inc svneol=native#text/plain
 rtl/freebsd/x86_64/bsyscall.inc svneol=native#text/plain
 rtl/freebsd/x86_64/cprt0.as svneol=native#text/plain
+rtl/freebsd/x86_64/dllprt0.as svneol=native#text/plain
 rtl/freebsd/x86_64/gprt0.as svneol=native#text/plain
 rtl/freebsd/x86_64/prt0.as svneol=native#text/plain
 rtl/freebsd/x86_64/si_c.inc svneol=native#text/plain
@@ -9291,10 +9293,13 @@ tests/test/cg/obj/freebsd/i386/ctest.o -text
 tests/test/cg/obj/freebsd/i386/tcext3.o -text
 tests/test/cg/obj/freebsd/i386/tcext4.o -text
 tests/test/cg/obj/freebsd/i386/tcext5.o -text
+tests/test/cg/obj/freebsd/x86_64/cpptcl1.o -text
+tests/test/cg/obj/freebsd/x86_64/cpptcl2.o -text
 tests/test/cg/obj/freebsd/x86_64/ctest.o -text
 tests/test/cg/obj/freebsd/x86_64/tcext3.o -text
 tests/test/cg/obj/freebsd/x86_64/tcext4.o -text
 tests/test/cg/obj/freebsd/x86_64/tcext5.o -text
+tests/test/cg/obj/freebsd/x86_64/tcext6.o -text
 tests/test/cg/obj/go32v2/i386/cpptcl1.o -text
 tests/test/cg/obj/go32v2/i386/cpptcl2.o -text
 tests/test/cg/obj/go32v2/i386/ctest.o -text

+ 1 - 1
compiler/ogelf.pas

@@ -1282,7 +1282,7 @@ implementation
             idtxt  : 'ELF';
             asmbin : '';
             asmcmd : '';
-            supported_targets : [system_x86_64_linux];
+            supported_targets : [system_x86_64_linux,system_x86_64_freebsd];
             flags : [af_outputbinary,af_smartlink_sections,af_supports_dwarf];
             labelprefix : '.L';
             comment : '';

+ 1 - 1
compiler/systems/i_bsd.pas

@@ -156,7 +156,7 @@ unit i_bsd;
             Cprefix      : '';
             newline      : #10;
             dirsep       : '/';
-            assem        : as_gas;
+            assem        : as_x86_64_elf64;
             assemextern  : as_gas;
             link         : nil;
             linkextern   : nil;

+ 34 - 3
compiler/systems/t_bsd.pas

@@ -273,9 +273,18 @@ begin
 { set special options for some targets }
   if not IsDarwin Then
     begin
-      prtobj:='prt0';
-      cprtobj:='cprt0';
-      gprtobj:='gprt0';
+      if isdll and (target_info.system in systems_freebsd) then
+        begin
+          prtobj:='dllprt0';
+          cprtobj:='dllprt0';
+          gprtobj:='dllprt0';
+        end
+      else
+        begin
+          prtobj:='prt0';
+          cprtobj:='cprt0';
+          gprtobj:='gprt0';
+        end;
       linkdynamic:=not(SharedLibFiles.empty);
       linklibc:=(SharedLibFiles.Find('c')<>nil);
       // this one is a bit complex.
@@ -386,6 +395,28 @@ begin
          HPath:=TCmdStrListItem(HPath.Next);
        end;
     end;
+      { force local symbol resolution (i.e., inside the shared }
+      { library itself) for all non-exorted symbols, otherwise }
+      { several RTL symbols of FPC-compiled shared libraries   }
+      { will be bound to those of a single shared library or   }
+      { to the main program                                    }
+      if (isdll) and (target_info.system in systems_freebsd) then
+        begin
+          LinkRes.add('VERSION');
+          LinkRes.add('{');
+          LinkRes.add('  {');
+          if not texportlibunix(exportlib).exportedsymnames.empty then
+            begin
+              LinkRes.add('    global:');
+              repeat
+                LinkRes.add('      '+texportlibunix(exportlib).exportedsymnames.getfirst+';');
+              until texportlibunix(exportlib).exportedsymnames.empty;
+            end;
+          LinkRes.add('    local:');
+          LinkRes.add('      *;');
+          LinkRes.add('  };');
+          LinkRes.add('}');
+        end;
 
   if not LdSupportsNoResponseFile then
     LinkRes.Add('INPUT(');

+ 65 - 63
rtl/freebsd/Makefile

@@ -696,193 +696,193 @@ ifeq ($(FULL_TARGET),mipsel-linux)
 override TARGET_IMPLICITUNITS+=exeinfo
 endif
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-nativent)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-iphonesim)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-wii)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-solaris)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),mipsel-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_RSTS+=math varutils typinfo classes variants dateutils sysconst
@@ -2601,6 +2601,8 @@ cprt0$(OEXT) : $(CPU_TARGET)/cprt0.as
 	$(AS) -o $(UNITTARGETDIRPREFIX)cprt0$(OEXT) $(CPU_TARGET)/cprt0.as
 gprt0$(OEXT) : $(CPU_TARGET)/gprt0.as
 	$(AS) -o $(UNITTARGETDIRPREFIX)gprt0$(OEXT) $(CPU_TARGET)/gprt0.as
+dllprt0$(OEXT) : $(CPU_TARGET)/dllprt0.as
+	$(AS) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(CPU_TARGET)/dllprt0.as
 $(SYSTEMUNIT)$(PPUEXT) : $(BSDINC)/$(SYSTEMUNIT).pp unxconst.inc $(SYSDEPS)
 	$(COMPILER) -Us -Sg $(BSDINC)/$(SYSTEMUNIT).pp
 objpas$(PPUEXT): $(OBJPASDIR)/objpas.pp $(INC)/except.inc $(SYSTEMUNIT)$(PPUEXT)

+ 4 - 1
rtl/freebsd/Makefile.fpc

@@ -9,7 +9,7 @@ main=rtl
 fpcpackage=y
 
 [target]
-loaders=prt0 cprt0 gprt0
+loaders=prt0 cprt0 gprt0 dllprt0
 units=$(SYSTEMUNIT) unixtype ctypes objpas macpas iso7185 \
       strings syscall sysctl  baseunix unixutil \
       unix rtlconsts initc cmem matrix \
@@ -120,6 +120,9 @@ cprt0$(OEXT) : $(CPU_TARGET)/cprt0.as
 gprt0$(OEXT) : $(CPU_TARGET)/gprt0.as
         $(AS) -o $(UNITTARGETDIRPREFIX)gprt0$(OEXT) $(CPU_TARGET)/gprt0.as
 
+dllprt0$(OEXT) : $(CPU_TARGET)/dllprt0.as
+        $(AS) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(CPU_TARGET)/dllprt0.as
+
 #
 # System Units (System, Objpas, Strings)
 #

+ 111 - 0
rtl/freebsd/i386/dllprt0.as

@@ -0,0 +1,111 @@
+#
+#   This file is part of the Free Pascal run time library.
+#   Copyright (c) 1999-2000 by Marco van de Voort, Michael Van Canneyt
+#                                                  and Peter Vreman
+#   members of the Free Pascal development team.
+#
+#   See the file COPYING.FPC, included in this distribution,
+#   for details about the copyright.
+#
+#   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.
+#
+#**********************************************************************}
+#
+# FreeBSD standard (shared) ELF startup code for Free Pascal
+#
+# FreeBSD RunTime dynamic loader only
+# calls the functions specified by -init
+# as functions without parameters
+# Thus, it is not possible to retrieve argc, argv and envp
+# for libraries.
+# On x86_64 CPU, using weak for the operatingsystem_parameter_XXX
+# allows to bind to main program parameters,
+# but this does not seem to work for i386 loader.
+ 
+        .file   "dllprt0.as"
+        .version        "01.01"
+gcc2_compiled.:
+.section        .rodata
+.LC0:
+        .ascii "\0"
+.data
+        .p2align 2
+	.globl __progname
+        .type    __progname,@object
+        .size    __progname,4
+__progname:
+        .long .LC0
+        .align  4
+        .type   __fpucw,@object
+        .size   __fpucw,4
+        .global __fpucw
+___fpucw:
+        .long   0x1332
+
+        .globl  ___fpc_brk_addr         /* heap management */
+        .type   ___fpc_brk_addr,@object
+        .size   ___fpc_brk_addr,4
+
+.text
+	.p2align 2,,3
+	.globl FPC_LIB_START
+	.type FPC_LIB_START,@function
+FPC_LIB_START:
+	.globl FPC_SHARED_LIB_START
+	.type FPC_SHARED_LIB_START,@function
+FPC_SHARED_LIB_START:
+        movb    $1,operatingsystem_islibrary
+
+        finit                           /* initialize fpu */
+        fwait
+        fldcw   ___fpucw
+
+        /* xorl    %ebp,%ebp */
+
+	call	PASCALMAIN@PLT
+	ret
+
+        pushl %eax
+        jmp   _haltproc
+        
+.p2align 2,0x90
+.globl _haltproc
+.type _haltproc,@function
+
+_haltproc:
+	.globl FPC_SHARED_LIB_EXIT
+	.type FPC_SHARED_LIB_EXIT,@function
+FPC_SHARED_LIB_EXIT:
+        call    FPC_LIB_EXIT@PLT
+           mov $1,%eax  
+           movzwl operatingsystem_result,%ebx
+           pushl %ebx
+           call _actualsyscall
+           addl  $4,%esp
+           jmp   _haltproc
+
+_actualsyscall:
+         int $0x80
+         jb .LErrorcode
+         xor %ebx,%ebx
+         ret
+.LErrorcode:
+         mov %eax,%ebx
+         mov $-1,%eax
+         ret
+        .comm   environ,4,4
+        .weak   _DYNAMIC
+        .ident  "GCC: (GNU) 2.7.2.1"
+
+
+__stkptr:
+        .skip   4
+
+        .comm operatingsystem_parameter_envp,4
+        .comm operatingsystem_parameter_argc,4
+        .comm operatingsystem_parameter_argv,4
+
+//.section .threadvar,"aw",@nobits
+        .comm   ___fpc_threadvar_offset,4

+ 6 - 5
rtl/freebsd/termiosproc.inc

@@ -26,15 +26,16 @@ end;
 
 Function TCSetAttr(fd:cint;OptAct:cint;const tios:TermIOS):cint;
 var
-  nr:cint;
+  nr: TIoCtlRequest;
 begin
   case OptAct of
   {the three constants TIOCSETA, TIOCSETAW and TIOCSETAF are
    unsigned values above $80000000, so that they give range check errors
-   on 32-bit systems }
-   TCSANOW   : nr:=cint(TIOCSETA);
-   TCSADRAIN : nr:=cint(TIOCSETAW);
-   TCSAFLUSH : nr:=cint(TIOCSETAF);
+   on 32-bit systems 
+   Solved by using TIoCtlRequest type for FpIOCtl second parameter }
+   TCSANOW   : nr:=TIOCSETA;
+   TCSADRAIN : nr:=TIOCSETAW;
+   TCSAFLUSH : nr:=TIOCSETAF;
   else
    begin
      fpsetErrNo(ESysEINVAL);

+ 78 - 0
rtl/freebsd/x86_64/dllprt0.as

@@ -0,0 +1,78 @@
+#
+#   This file is part of the Free Pascal run time library.
+#   Copyright (c) 1999-2000 by Marco van de Voort, Michael Van Canneyt
+#                                                  and Peter Vreman
+#   members of the Free Pascal development team.
+#
+#   See the file COPYING.FPC, included in this distribution,
+#   for details about the copyright.
+#
+#   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.
+#
+#**********************************************************************}
+#
+# FreeBSD standard (shared) ELF startup code for Free Pascal
+#
+# FreeBSD RunTime dynamic loader only
+# calls the functions specified by -init
+# as functions without parameters
+# Thus, it is not possible to retrieve argc, argv and envp
+# for libraries.
+# On x86_64 CPU, using weak for the operatingsystem_parameter_XXX
+# allows to bind to main program parameters,
+# but this does not seem to work for i386 loader.
+ 
+	.file	"crt1.c"
+#APP
+	.ident	"$FreeBSD: src/lib/csu/common/crtbrand.c,v 1.4 2003/10/17 15:43:13 peter Exp $"
+#NO_APP
+	.section	.note.ABI-tag,"a",@progbits
+	.p2align 2
+	.type	abitag, @object
+	.size	abitag, 24
+abitag:
+	.long	8
+	.long	4
+	.long	1
+	.string	"FreeBSD"
+	.long	700055
+
+	.text
+#APP
+	.ident	"$FreeBSD: src/lib/csu/amd64/crt1.c,v 1.13 2003/04/30 19:27:07 peter Exp $"
+#NO_APP
+	.p2align 2,,3
+	.globl FPC_LIB_START
+	.type FPC_LIB_START,@function
+FPC_LIB_START:
+	.globl FPC_SHARED_LIB_START
+	.type FPC_SHARED_LIB_START,@function
+FPC_SHARED_LIB_START:
+	# jmp	_startlib@PLT
+        movb    $1,operatingsystem_islibrary(%rip)
+        #movq    operatingsystem_islibrary@GOTPCREL(%rip),%rax
+        #movb    $1,(%rax)
+	call	PASCALMAIN@PLT
+	ret
+	.p2align 2,,3
+        .globl  _haltproc
+        .type   _haltproc,@function
+/* this routine is only called when the halt() routine of the RTL embedded in
+  the shared library is called */
+_haltproc:
+	.globl FPC_SHARED_LIB_EXIT
+	.type FPC_SHARED_LIB_EXIT,@function
+FPC_SHARED_LIB_EXIT:
+        call    FPC_LIB_EXIT@PLT
+	movl    $1,%eax                 /* exit syscall */
+        movq    operatingsystem_result(%rip),%rbx
+        movzwl  (%rbx),%edi
+        syscall
+        jmp     _haltproc@PLT
+	/* Do not fail linkage if argc, argv and envp are not found. */
+	.weak   operatingsystem_parameter_argc
+	.weak   operatingsystem_parameter_argv
+	.weak   operatingsystem_parameter_envp
+

二進制
tests/test/cg/obj/freebsd/x86_64/cpptcl1.o


二進制
tests/test/cg/obj/freebsd/x86_64/cpptcl2.o


二進制
tests/test/cg/obj/freebsd/x86_64/tcext6.o


+ 1 - 0
tests/test/cg/obj/readme.txt

@@ -26,4 +26,5 @@ Solaris-i386 : gcc (GCC) 3.4.3 (csl-sol210-3_4-20050802)
 Solaris-x86_64 : gcc (GCC) 3.4.3 (csl-sol210-3_4-20050802) with -m64 option
 
 Freebsd-x86_64 : gcc (GCC) 4.2.1 20070719  [FreeBSD]
+
 OpenBSD-i386 : gcc (GCC) 4.2.1 20070719