So since we're talking about language-lawyer stuff, we go to the standards.
I don't have the C11 standard, but I do have the C99. This is what is actually required:
An identifier declared in different scopes or in the same scope more than once can be made to refer to the same object or function by a process called linkage. There are three kinds of linkage: external, internal, and none.
...
If the declaration of a file scope identifier for an object or a function contains the storage class specifier static, the identifier has internal linkage.
Everywhere in the standard after that, there are references about if something "has linkage" or if it has "external or internal linkage", and prohibitions on things that have no linkage. There are no specific requirements about what ends up in object files. Internal linkage must be accessible inside that translation unit (=object file) and different translation units can have their own names with internal linkage.
That means you can make "static void foo(void){}" in as many object files as you want, but the linker won't try to bind them together. If they had external linkage it would complain because you can only have one of them globally.
So now back to your questions.
1. I know obj .o file has a some table of exported symbols and offsets to binary inside, would just the symbols y and f be deleted or maybe only marked as internal ? (maybe someone would know if offset to binary is also deleted there)
2. is the .o format (used by 32 bit mingw/gcc) hard to learn ? maybe someone know some easy tutorial on this?
1. They can include anything they want in the .o file.
There are some things they are required to support in a translation unit, but they can include all the extra stuff that they want.
They are not required to track anything with internal linkage.
They might include them in the file. They might not include them in the file. This might be adjustable based on optimizer settings, debug information, and other compiler options. As the example from rnlf shows above, his compiler did include the information inside the object file even though it was not required. It is likely that he could change his compiler options and get them to vanish from the file. It is not required to be there.
2. It uses the COFF format for object files, the PE format for Windows executables.
The file formats have been used for decades and are well documented. Microsoft documented both PE and COFF together here. It is updated every few years with new processor IDs, but the data structures and overall format is the same as it was in the 1980s. Google can find many other sources including books to learn from. I don't know if you consider it hard to learn or not.
So...
The big thing to know is that the language specifies minimum behavior. Things must be at least a certain size. Things must have at least this visibility. Algorithms must perform at least this fast. Elements must contain at least this data.
Compilers are allowed to go beyond that functionality if they want. Compiler writers add their own bonus features and extensions all the time. They routinely add debugging information, profiling information, and assorted metadata that is far beyond what the standard requires.
If you are trying to hide object names, making them static and marking functions as inline can potentially help. You would still need to go through the object file to ensure there aren't any direct references to the names. Turning on heavy optimizations, disabling debug information, and using symbol-stripping tools might help obliterate named references.