Control-flow graphs represent the flow of control of a program; if a CFG makes sense for your binary files in any way, they are necessarily executable one way or another, given an entry point.
Once you have your entry point as an address or function symbol, you can feed it to your binary analysis tool/library/platform and extract your CFG. There are many free open-source solutions, such as angr, BAP...
Note, if you can get rid of the binary analysis requirement and integrate this to a compile chain, LLVM is a powerful tool for this task.