Difference between revisions of "C++ support"
(Created page with "= Introduction = Despite the fact that ERIKA is implemented using the C and the Assembly programming languages, it has <u>experimental</u> support to link applications implem...") |
|||
Line 2: | Line 2: | ||
Despite the fact that ERIKA is implemented using the C and the Assembly programming languages, | Despite the fact that ERIKA is implemented using the C and the Assembly programming languages, | ||
− | it has <u>experimental</u> support | + | it has <u>experimental</u> support for linking applications implemented using the C++ language. |
= Basic support = | = Basic support = | ||
Line 24: | Line 24: | ||
shown [https://github.com/evidence/linux-jailhouse-jetson/commit/d191fdb65584ce98183281d9e05c593a6ae9b235 here]. | shown [https://github.com/evidence/linux-jailhouse-jetson/commit/d191fdb65584ce98183281d9e05c593a6ae9b235 here]. | ||
− | This is the basic list of the features | + | This is the basic list of the supported features: |
<ul> | <ul> | ||
<li> Normal classes | <li> Normal classes |
Revision as of 17:20, 8 August 2018
Introduction
Despite the fact that ERIKA is implemented using the C and the Assembly programming languages, it has experimental support for linking applications implemented using the C++ language.
Basic support
The .cpp
file extension is automatically recognized and handled by the Makefiles.
Put in the OIL file the following information:
CFLAGS = "-std=c++11"; CFLAGS = "-fno-exceptions"; CFLAGS = "-mstrict-align";
Moreover, embed through the following braces any C symbol that must be linked to the application (e.g. idle_hook
, tasks, etc.)
extern "C"{ //... }
The main
function can be left outside the braces.
This must be done also for external libraries. In case of Jailhouse, for example, the inmate library must be modified as shown here.
This is the basic list of the supported features:
- Normal classes
- Template metaprogramming
- C++11: lambda expressions, type deduction (i.e.
auto
)
STL support
If you also want to support the STL features provided by the bare-metal newlib
toolchain (i.e. the one provided by Linaro's bare-metal gcc toolchain), you
have to modify the linker script to set the end
symbol:
.data : { *(.data) }
. = ALIGN(8); /* "end" is used by newlib's syscalls */ PROVIDE(end = .);
. = ALIGN(16); stack_bottom = .; . = ALIGN(4096); . = . + 0x10000; stack_top = .;
Then, add the following information to the OIL file:
CFLAGS = "-I/path/to/aarch64-elf/aarch64-elf/include/c++/7.2.1/"; CFLAGS = "-I/path/to/aarch64-elf/aarch64-elf/include/c++/7.2.1/aarch64-elf/"; CFLAGS = "-I/path/to/aarch64-elf/aarch64-elf/libc/usr/include/";
LDFLAGS = "-L /path/to/aarch64-elf/aarch64-elf/libc/usr/lib"; LDFLAGS = "-L /path/to/aarch64-elf/aarch64-elf/lib/";
LIBS = "-l:libc.a"; LIBS = "-l:libgcc.a"; LIBS = "-l:librdimon.a"; LIBS = "-l:libsupc++.a";