Sample "hello2"
July 13, 2026 ยท View on GitHub
This sample is essentially the same as Sample "hello", but it demonstrates how to compile multiple source files into a single binary using ESSTRA Core.
Please note that this document assumes you have completed all the steps outlined in Sample "hello".
Source Code to be Compiled
In this sample, we use ESSTRA Core to compile
the two source files hello_main.c and hello_sub.c
into a single binary named hello2.
The binary hello2 is a program that, similar to Sample "hello",
simply prints Hello, world! to the standard output.
hello_main.c:
#include "hello_sub.h"
int main(void)
{
sub_puts("Hello, world!");
return 0;
}
hello_sub.c:
#include <stdio.h>
void sub_puts(const char *str)
{
puts(str);
}
In this program, the function sub_puts() provided by
hello_sub.c is called within the main() function in
hello_main.c. Therefore, we have prepared a header file
hello_sub.h to use the function defined in
hello_sub.c externally:
hello_sub.h:
#ifndef _HELLO_SUB_H_
extern void sub_puts(const char *);
#endif
Similar to Sample "hello", the license is specified at the beginning of each file as follows:
hello_main.c:
// SPDX-License-Identifier: MIT
hello_sub.c:
// SPDX-License-Identifier: BSD-3-Clause
hello_sub.h:
// SPDX-License-Identifier: LGPL-2.1-or-later
Please note that these licenses are only for verifying the operation of the ESSTRA tools and do not represent the actual licenses of the source code. For the actual source code licenses, please refer to the LICENSE file in the top-level directory.
Compiling with ESSTRA Core
We will compile the source files shown above to generate the binary
hello2. By using ESSTRA Core during compilation,
metadata is embedded into hello2.
Since we are using GCC version 11 on an x86_64 PC, the command line would be as follows:
$ gcc -fplugin=/usr/local/lib/gcc/x86_64-linux-gnu/11/plugin/esstracore.so hello_main.c hello_sub.c -o hello2
If you have already installed the Spec File,
ESSTRA Core will intervene in the compilation
without needing to specify the -fplugin= option, yielding the same result as above:
$ gcc hello_main.c hello_sub.c -o hello2
The output of the generated binary hello2 is shown below:
$ ./hello2
Hello, world!
Verifying Metadata in the Binary
Use the show command of ESSTRA Utility to verify the metadata within hello2:
$ esstra show hello2
And you will get a result as follows:
Headers:
ToolName: ESSTRA Core
ToolVersion: 0.5.0
DataFormatVersion: 0.1.0
InputFileNames:
- hello_main.c
- hello_sub.c
BinaryFile: /home/snagao/esstra/samples/hello2/hello2
SourceFiles:
- Directory: /home/snagao/esstra/samples/hello2
Files:
- File: hello_main.c
SHA1: f7f5c447d68fd9685594a31cb10c8d8b1dd5ebd6
- File: hello_sub.c
SHA1: cfb72998ae0242237fa42c8bcf61ee5887137392
- File: hello_sub.h
SHA1: 3e5b3ed1aed966c0e0c183eac8fe6ea02dfa62a0
- Directory: /usr/include
Files:
- File: features-time64.h
SHA1: 57c3c8093c3af70e5851f6d498600e2f6e24fdeb
- File: features.h
SHA1: d8725bb98129d6d70ddcbf010021c2841db783f7
- File: stdc-predef.h
SHA1: 2fef05d80514ca0be77efec90bda051cf87d771f
- File: stdio.h
SHA1: c7181b48c4194cd122024971527aab4056baf600
- Directory: /usr/include/x86_64-linux-gnu/bits
Files:
- File: floatn-common.h
SHA1: 3f37104123a2e6180621331c1da87125808e47bd
- File: floatn.h
SHA1: 806b759ab6894a09a3b3a422eec5f2414ba7dab7
- File: libc-header-start.h
SHA1: e0a400c194cd3962a342a6504a441920163b799c
- File: long-double.h
SHA1: 4e3f5928e816ad29079d1c7d75f3a510a0939ffb
- File: stdio.h
SHA1: 521d7cd0f6572f70122386784120cc55d84899bc
- File: stdio2.h
SHA1: 6c3ee923db9679a79941a688de72e114a794fc54
- File: stdio_lim.h
SHA1: 6210c8ae410ee0f39a6096b0adb9fa86febd3517
- File: time64.h
SHA1: ab2017da21608498b58eea37b2aa6a3387ee978c
- File: timesize.h
SHA1: f1dd8d62a4d75288654626933edfc82ccf2394a7
- File: types.h
SHA1: e5893a9c4c523615c73a51feb9680279608027c6
- File: typesizes.h
SHA1: ee94b5a60d007c23bdda9e5c46c8ba40f4eb402c
- File: wordsize.h
SHA1: 281ddd3c93f1e8653e809a45b606574c9b691092
- Directory: /usr/include/x86_64-linux-gnu/bits/types
Files:
- File: FILE.h
SHA1: 497924e329d53517631713ae52acb73e870d7d65
- File: __FILE.h
SHA1: 274242343e85d1c06e7f5ccc5abf15e120f6e957
- File: __fpos64_t.h
SHA1: ac38e294b004f6e2bf18f1c55e03dc80f48d6830
- File: __fpos_t.h
SHA1: 760ef77769ac1921f4b1f908cbf06863e2506775
- File: __mbstate_t.h
SHA1: e3a4f2ee55e635520db0b4610d2b361e9ce41de7
- File: struct_FILE.h
SHA1: 1dbf8bac589cb09e09aa4c1d36913e549a57bcf0
- Directory: /usr/include/x86_64-linux-gnu/gnu
Files:
- File: stubs-64.h
SHA1: f7603fa3908b56e9d1b33c91590db3252e13a799
- File: stubs.h
SHA1: be168037b7503a82b1cf694cdbac8c063bb6e476
- Directory: /usr/include/x86_64-linux-gnu/sys
Files:
- File: cdefs.h
SHA1: a419a6372029d89ba38ada0811d34f51df8d09b7
- Directory: /usr/lib/gcc/x86_64-linux-gnu/11/include
Files:
- File: stdarg.h
SHA1: fa23f49da8a0a5068b781dff7182f1a1c363dc30
- File: stddef.h
SHA1: 0de70008ffa3f198baf55c7b3f3d03b4ca11c21f
You can see that the metadata includes the source files specified during
compilation: hello_main.c, hello_sub.c,
and hello_sub.h.
Additionally, similar to Sample "hello",
it also includes information about all header files that are explicitly or
implicitly #include'd.
Adding License Information to Metadata
Here, similar to
Sample "hello",
we will use the license information file
SPDX2TV_esstra_fossology.spdx
that has already been prepared.
Next, you can add license information to the metadata in the binary
hello2 using the following command:
$ esstra update hello2 -i SPDX2TV_esstra_fossology.spdx
* processing 'hello2'...
* done.
To display the metadata content of the binary hello2, use the following command:
$ esstra show hello2
You will get the result shown below:
Headers:
ToolName: ESSTRA Core
ToolVersion: 0.5.0
DataFormatVersion: 0.1.0
InputFileNames:
- hello_main.c
- hello_sub.c
BinaryFile: /home/snagao/esstra/samples/hello2/hello2
SourceFiles:
- Directory: /home/snagao/esstra/samples/hello2
Files:
- File: hello_main.c
SHA1: f7f5c447d68fd9685594a31cb10c8d8b1dd5ebd6
LicenseDetected:
- MIT
- File: hello_sub.c
SHA1: cfb72998ae0242237fa42c8bcf61ee5887137392
LicenseDetected:
- BSD-3-Clause
- File: hello_sub.h
SHA1: 3e5b3ed1aed966c0e0c183eac8fe6ea02dfa62a0
LicenseDetected:
- LGPL-2.1-or-later
- Directory: /usr/include
Files:
- File: features-time64.h
SHA1: 57c3c8093c3af70e5851f6d498600e2f6e24fdeb
:
From the above result, you can see that the LicenseDetected tags have been added
to the metadata for the files
hello_main.c,
hello_sub.c, and
hello_sub.h,
with the values MIT, BSD-3-Clause, and LGPL-2.1-or-later, respectively.
Summary
In this sample, we confirmed that by using
ESSTRA Core during the compilation of multiple
source files into a single binary, the metadata includes information on
all the source files involved in the compilation and
all the header files they #include.
Additionally, by using ESSTRA Utility to add license information to the metadata,
we updated the metadata in the binary hello2 and confirmed that the license
information declared in each source file was added to the metadata.