1Building and using the Library {#build_lib} 2============================== 3 4@brief How to build the library and test programs and include the library in an application 5 6Platform Support 7---------------- 8 9The current makefiles and build projects support building the library on: 10 - Linux and Windows, x86 or x64 hosts. 11 - ARM linux - AArch32 and AArch64 12 - ARM aarch32 and aarch64 libs, x-compiled on x86/64 hosts. 13 14In addition to building the library from the project, the library may be installed into the standard 15`/usr/lib/` area in Linux, and will soon be available as a package from Linux Distros. 16 17Building the Library 18-------------------- 19 20The library and test programs are built from the library `./build/<platform>` directory, where 21<platform> is either 'linux' or 'win-vs2022' 22 23See [`./docs/test_progs.md`](@ref test_progs) for further information on use of the test 24programs. 25 26### Linux x86/x64/ARM ### 27 28Libraries are built into a <tgt_dir>. This is used as the final output directory for the 29libraries in `decoder/lib/<tgt_dir>`, and also as a sub-directory of the build process for 30intermediate files - `decoder/build/linux/ref_trace_decode_lib/<tgt_dir>`. 31 32For a standard build, go to the `./build/linux/` and run `make` in that directory. 33 34This will set <tgt_dir> to `builddir` for all build variants of the library. Using this only one variant of the library can be built at any one time. 35 36For development, alternatively use `make -f makefile.dev` 37 38This will set <tgt_dir> to `linux<bit-variant>/<dbg|rel>` and therefore build libraries into the 39`decoder/lib/linux<bit-variant>/<dbg|rel>` directories, allowing multiple variants of the library 40to be present during development. 41 42e.g. 43 44`./lib/linux64/rel` will contain the linux 64 bit release libraries. 45 46`./lib/linux-arm64/dbg` will contain the linux aarch 64 debug libraries for ARM. 47 48Options to pass to both makefiles are:- 49- `DEBUG=1` : build the debug version of the library. 50 51Options to pass to makefile.dev are:- 52- ARCH=<arch> : sets the bit variant in the delivery directories. Set if cross compilation for ARCH 53 other than host. Otherwise ARCH is auto-detected. 54 <arch> can be x86, x86_64, arm, arm64, aarch64, aarch32 55 56For cross compilation, set the environment variable `CROSS_COMPILE` to the name path/prefix for the 57compiler to use. The following would set the environment to cross-compile for ARM 58 59 export PATH=$PATH:~/work/gcc-x-aarch64-6.2/bin 60 export ARCH=arm64 61 export CROSS_COMPILE=aarch64-linux-gnu- 62 63The makefile will scan the `ocsd_if_version.h` to get the library version numbers and use these 64in the form Major.minor.patch when naming the output .so files. 65 66Main C++ library names: 67- `libcstraced.so.M.m.p` : shared library containing the main C++ based decoder library 68- `libcstrace.so.M` : symbolic link name to library - major version only. 69- `libcstrace.so` : symbolic link name to library - no version. 70 71C API wrapper library names: 72- `libcstraced_c_api.so.M.m.p` : shared library containing the C-API wrapper library. Dependent on `libcstraced.so.M` 73- `libcstraced_c_api.so.M` : symbolic link name to library - major version only. 74- `libcstraced_c_api.so` : symbolic link name to library - no version. 75 76Static versions of the libraries: 77- `libcstraced.a` : static library containing the main C++ based decoder library. 78- `libcstraced_c_api.a` : static library containing the C-API wrapper library. 79 80Test programs are delivered to the `./tests/bin/<tgt_dir>` directories. 81 82The test programs are built to used the .so versions of the libraries. 83- `trc_pkt_lister` - dependent on `libcstraced.so`. 84- `simple_pkt_print_c_api` - dependent on `libcstraced_c_api.so` & hence `libcstraced.so`. 85 86The test program build for `trc_pkt_lister` also builds an auxiliary library used by this program for test purposes only. 87This is the `libsnapshot_parser.a` library, delivered to the `./tests/lib/<tgt_dir>` directories. 88 89**Note on Linux Build Directory Names** 90 91Due to tool limitations, the makefiles will not operate correctly if the path to the opencsd directories contains spaces. 92 93e.g. checking out the project into a directory such as ` /home/name/my opencsd/` will result in build failures. 94 95__Installing on Linux__ 96 97The libraries can be installed on linux using the `make install` command. This will usually require root privileges. Installation will be the version in the `./lib/<tgt_dir>` directory, according to options chosen. 98 99e.g. ` make -f makefile.dev DEBUG=1 install` 100 101will install from `./lib/linux64/dbg` 102 103The libraries `libopencsd` and `libopencsd_c_api` are installed to `/usr/lib`. 104 105Sufficient header files to build using the C-API library will be installed to `/usr/include/opencsd`. 106 107The installation can be removed using `make clean_install`. No additional options are necessary. 108 109 110### Windows (x86/x64) ### 111 112Use the `.\build\win\ref_trace_decode_lib\ref_trace_decode_lib.sln` file to load a solution 113which contains all library and test build projects. 114 115Libraries are delivered to the `./lib/win<bitsize>/<dbg\rel>` directories. 116e.g. `./lib/win64/rel` will contain the windows 64 bit release libraries. 117 118The solution contains four configurations:- 119- *Debug* : builds debug versions of static C++ main library and C-API libraries, test programs linked to the static library. 120- *Debug-dll* : builds debug versions of static main library and C-API DLL. C-API statically linked to the main library. 121C-API test built as `simple_pkt_print_c_api-dl.exe` and linked against the DLL version of the C-API library. 122- *Release* : builds release static library versions, test programs linked to static libraries. 123- *Release-dll* : builds release C-API DLL, static main library. 124 125_Note_: Currently there is no Windows DLL version of the main C++ library. This may follow once 126the project is nearer completion with further decode protocols, and the classes requiring export are established.. 127 128Libraries built are:- 129- `libcstraced.lib` : static main C++ decoder library. 130- `cstraced_c_api.dll` : C-API DLL library. Statically linked against `libcstraced.lib` at .DLL build time. 131- `libcstraced_c_api.lib` : C-API static library. 132 133There is also a project file to build an auxiliary library used `trc_pkt_lister` for test purposes only. 134This is the `snapshot_parser_lib.lib` library, delivered to the `./tests/lib/win<bitsize>/<dgb\rel>` directories. 135 136 137### Additional Build Options ### 138 139__Library Virtual Address Size__ 140 141The ocsd_if_types.h file includes a #define that controls the size of the virtual addresses 142used within the library. By default this is a 64 bit `uint64_t` value. 143 144When building for ARM architectures that have only a 32 bit Virtual Address, and building on 14532 bit ARM architectures it may be desirable to build a library that uses a v-addr size of 14632 bits. Define `USE_32BIT_V_ADDR` to enable this option 147 148 149Including the Library in an Application 150--------------------------------------- 151 152The user source code includes a header according to the API to be used:- 153 154- Main C++ decoder library - include `opencsd.h`. Link to C++ library. 155- C-API library - include `opencsd_c_api.h`. Link to C-API library. 156 157### Linux build ### 158 159By default linux builds will link against the .so versions of the library. Using the C-API library will also 160introduce a dependency on the main C++ decoder .so. Ensure that the library paths and link commands are part of the 161application makefile. 162 163To use the static versions use appropriate linker options. 164 165### Windows build ### 166 167To link against the C-API DLL, include the .DLL name as a dependency in the application project options. 168 169To link against the C-API static library, include the library name in the dependency list, and define the macro 170`OCSD_USE_STATIC_C_API` in the preprocessor definitions. This ensures that the correct static bindings are declared in 171the header file. Also link against the main C++ library. 172 173To link against the main C++ library include the library name in the dependency list. 174 175 176Library Performance Options 177--------------------------- 178 179The library caches parts of the memory images requested during the decode process, to improve performance by reducing the number of requests to the memory accessor (memacc) objects or callbacks. 180 181The default settings can be adjusted at runtime either by programmable API, or using environment variables. 182 183Cache parameters can be set in terms of page size and number of pages. 184Caching can also be disabled. 185 186Page size can vary between 64 bytes and 16384 bytes. 187Number of pages can vary between 4 and 256. 188 189Default values are set at 16 pages of 2048 bytes. 190 191### Environment variables to control caching ### 192 193- `OPENCSD_MEMACC_CACHE_PAGE_SIZE` : Page size in bytes. 194- `OPENCSD_MEMACC_CACHE_PAGE_NUM` : number of pages. 195- `OPENCSD_MEMACC_CACHE_OFF` : disable memacc caching. 196 197 198Library Debug Options 199--------------------- 200 201### ETMv4 / ETE instruction run limit ### 202 203The ETMv4 / ETE decoder has an optional run length limit for the amount of instructions in a range permitted before an error code will be returned. 204 205This option allows debug of potential runaway decode if incorrect memory image imformation is provided to the debuger. 206 207Option controlled by environment variable `OPENCSD_INSTR_RANGE_LIMIT`. Set value to number of instructions as the limit. 208 209### AA64 Invalid opcode detection ### 210 211The instruction decode part of the library can be set to detect invalid aarch64 opcodes and throw an error. 212 213In the aarch64 opcodes define any opcode with the top 16 bits as 0x0000 as an invalid opcode range - which is the range detected by the library. 214Any other opcodes that are undefined or invalid that are not in this range will not be detected. 215 216This also allows the potential to detect runaway decode where incorrect memory information is supplied which contains data sections initilised with 0x00000000. 217 218Option is controlled by environment variable `OPENCSD_ERR_ON_AA64_BAD_OPCODE`. If this is set then the invalid opcodes will be detected. 219 220