Yes, that's a problem! "Impossible" is a really big word, but what you propose is "highly impractical".
The "-f bin" format doesn't support "extern" 'cause it's a feature of a linkable file format, and "-f bin" doesn't generate linkable objects. You could, in theory, "hand build" an object file format header with "-f bin"... but once you ran a linker on it, it would no longer be a flat binary file. Depending on why you "absolutely need binary for other purposes", this might be acceptable, or not.
If you "really need binary", perhaps you don't really need to call a C function. I'd go so far as to say you definitely don't "need" to call a C function, but it may be "inconvenient" to avoid it.
Where is "printf" when this is going on? In a dynamic library? It might be possible to write an equivalent of "LoadLibrary" and "GetProcessAddress" into your binary file. In theory, it should be possible to write code to find some other function (C or not) wherever it may be, load it into memory (if it isn't already in memory), possibly apply relocations, and execute it. I doubt if you want to do this. Almost certainly easier to emulate the C function!
I think you want to abandon either "binary file" or "call C". Which one, probably depends on what you're trying to do. What environment is this program intended to run in?
Best,
Frank