Free Pascal on OSv
OSv
OSv is an operating system based on Linux optimized for the cloud. Official page It runs a single application together with a small kernel and all needed libraries in a virtual machine. That means to run OSv applications you need to install a hypervisor such as QEMU/KVM or VirtualBox.
Installation
Install OSv on Linux
This worked on 3rd Mar 2015 on Ubuntu 14.10 and on 3rd Sep 2016 on Ubuntu 16.04:
Please read http://osv.io/run-locally/. Especially about the "Data collection".
Downloading capstan to ~/bin/capstan:
curl https://raw.githubusercontent.com/cloudius-systems/capstan/master/scripts/download | bashInstall needed qemu-kvm (VirtualBox is also possible, but not handled in this document)
sudo apt-get install qemu-kvmBuilding an instance with capstan
Capstan takes a basic image and adds your libraries to create a VM image. It then starts the VM and runs the 'main' function of your library. At the moment only Linux/amd64 dynamic libraries with PIC are supported.
Capstanfile
Capstan needs a config file named Capstanfile. Read here for details.
Create a directory for the example. For instance ~/osv_fpc_test.
Here is an example config for a hello world program (~/osv_fpc_test/Capstanfile):
# Name of the base image. Capstan will download this automatically from Capstan repository.
base: cloudius/osv-base# The command line passed to OSv to start up the application.
cmdline: /tools/hello.so# The command used to build the application.
build: ./compile.sh# List of files that are included in the generated image.
files:
/tools/hello.so: hello.soPascal Library
The small Linux kernel does not support all syscalls needed by the default FPC Linux System unit.
See here for some details what OSv does not support: https://github.com/cloudius-systems/osv/wiki/Porting-native-applications-to-OSv
You need to build the System unit using Libc (tested with fpc trunk revision 34418):
cd fpc_src_3.1.1
make clean all OPT='-dFPC_USE_LIBC -Fl/usr/lib/gcc/x86_64-linux-gnu/5'
sudo make install INSTALL_PREFIX=/usrhello.pas
library hello;
// start function for OSv
function main: longint; cdecl;
begin
Writeln('It works!');
main:=0;
end;
exports main name 'main'; // OSv searches for 'main' in the library
end.Here is the ~/osv_fpc_test/compile.sh:
#!/bin/bash
# create a dynamically linked library hello.so
/usr/lib/fpc/3.1.1/ppcx64 -fPIC -XD -Xc -gw2 -ohello.so hello.pasBuilding
Note: The first time you build, capstan will download the base VM image "cloudius/osv-base" (~/.capstan/).
[]$ cd ~/osv_fpc_test
[]$ ~/bin/capstan build
Building osv...
Uploading files...
1 / 1 [===================================] 100.00 %Running
[]$ ~/bin/capstan run
Created instance: helloworld
OSv v0.18
eth0: 192.168.122.15
It works!Pascal Library without using the System unit
As demonstration here is a library, that does not call the system unit (works the normal FPC system unit):
hello.pas
Here is the ~/osv_fpc_test/hello.pas:
library hello;
uses
unixtype;
// use the C function 'write'
function CWrite(fd : cInt; buf:pChar; nbytes : unixtype.TSize): TSsize; external name 'write';
// start function for OSv
function main: longint; cdecl;
const
MyText: PChar = 'It works!'#10;
begin
CWrite(StdOutputHandle,MyText,strlen(MyText));
main:=0;
end;
exports main name 'main'; // OSv searches for 'main' in the library
end.Compile a library that does not call the system init
Here is the ~/osv_fpc_test/compile.sh:
#!/bin/bash# compile without linking, create a dynamically linked library hello.so
fpc -fPIC -XD -Xc -g -s -ohello.so hello.pas
# link without -init FPC_SHARED_LIB_START -fini FPC_LIB_EXIT
/usr/bin/ld -b elf64-x86-64 -m elf_x86_64 -soname hello.so -shared -L. -o hello.so link.resBuilding
Note: The first time you build, capstan will download the base VM image "cloudius/osv-base" (~/.capstan/).
[]$ cd ~/osv_fpc_test
[]$ ~/bin/capstan build
Building osv...
Uploading files...
1 / 1 [===================================] 100.00 %Running
[]$ cd ~/osv_fpc_test
[]$ ~/bin/capstan run
Created instance: osv
OSv v0.18
eth0: 192.168.122.15
It works!From the Free Pascal wiki, page "Free Pascal on OSv", as it stood on 2020-02-16 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.