Clang function-sections flag

Hey Clang-people,

I have a nooby question about the -ffunction-sections flag of Clang.

As far as I used to understand, setting this flag means, that every function gets their own section. Makes sense so far.

Recently I started to look into the ELF format a bit so that subject came up. I created a macro to quickly generate me some functions:

#define wuff(a, b) \

a##b

#define crap(num) \

int wuff(schwimmflugel, num) () \

{ \

return num; \

}

Creating the object file and looking into it, I found a section header for every of my functions no matter if I set the -ffunction-sections flag or not.

Also setting my function to static didn’t changed a thing… well besides from having those functions striped from my object file xD

So… what does that flag effect?

Kind greetings

Björn

Try adding -fno-function-sections to make sure it’s turned off (sounds like it is on by default for your target).

–paulr

Hey Paul,

I tried that already and got:

“error: unknown argument: ‘-fno-function-sections’”

I use Clang-Cl under Windows, creating an ELF file for x86_64-pc-windows-elf – however the flag is not supported (not with -Xclang but also not without)

However “-ffunction-sections” is accepted (with -Xclang)

Kind greetings

Björn

Looks like CloudABI is the only triple that uses it by default. Presumably you aren’t on that, but I could also be missing something.

For me, it looks like BOTH -ffunction-sections and -fno-function-sections are unknown arguments in clang-cl, however if you use the /clang: syntax, both work. Can you try that?

/clang:-fno-function-sections

Using /clang:-fno-function-sections and /clang:-ffunction-sections were both accepted by Clang-cl while /clang:-planschbecken was rejected.

Seems like that worked O_O Thank you!
I gonna check if this will make a difference now.

In the meantime… why isn’t /clang: and -Xclang the same?!

/clang: sends to the ‘driver’. -Xclang sends to the ‘compiler instance’ (the -cc1 compiler), which the driver calls. They are actually the same executable which makes it a touch more confusing.

Allright :’D

That worked! Now my 100x functions are in one section! Thank you so much guys!

Looks like everything is set, but let me try to explain a little bit.

The /O1 and /O2 options of MSVC and clang-cl actually expand to several other options. You can see this in the docs:
https://docs.microsoft.com/en-us/cpp/build/reference/o1-o2-minimize-size-maximize-speed?view=msvc-160

/O2 (Maximize Speed) /Og /Oi /Ot /Oy /Ob2 /GF /Gy

In particular, /Gy means -ffunction-sections. If you were building your code with optimizations enabled, (clang-cl /O2 /c foo.cpp), that would explain why you see one section per function.

If you want to disable function sections more directly, consider passing the /Gy- flag after the /O2 flag.