Linking object files

Linking foreign object files to GHDL

You may add additional files or options during the link of GHDL using -Wl, as described in Passing options to other programs. For example:

ghdl -e -Wl,-lm math_tb

will create the math_tb executable with the lm (mathematical) library.

Note the c library is always linked with an executable.


The process for personal code is the same, provided the code is provided as a C source or compiled to an object file. Analysis must be made of the HDL files, then elaboration with -e -Wl,personal.c [options...] primary_unit [secondary_unit] as arguments. Additional C or object files are flagged as separate -Wl,* arguments. The elaboration step will compile the executable with the custom resources. Further reading (particularly about the backend particularities) is at Elaboration [-e] and Run [-r].

Linking GHDL object files to Ada/C

As explained previously in Wrapping a simulation (ghdl_main), you can start a simulation from an Ada or C program. However the build process is not trivial: you have to elaborate your program and your VHDL design.


If the foreign language is C, this procedure is equivalent to the one described in Linking foreign object files to GHDL, which is easier. Thus, this procedure is explained for didactic purposes. When suitable, we suggest to use -e, instead of --bind and --list-link.

First, you have to analyze all your design files. In this example, we suppose there is only one design file, design.vhdl.

$ ghdl -a design.vhdl

Then, bind your design. In this example, we suppose the entity at the design apex is design.

$ ghdl --bind design

Finally, compile/bind your program and link it with your VHDL design:

in C:

gcc my_prog.c -Wl,`ghdl --list-link design`

in Ada:

$ gnatmake my_prog -largs `ghdl --list-link design`

See GCC/LLVM only commands for further details about --bind and --list-link.