I have been re-learning C language recently with Learn C the Hard Way.
Today, I was working with a Makefile. It has
CFLAGS options code like this:
CFLAGS=-g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG $(OPTFLAGS)
When I ran
make, I got an error:
clang: warning: argument unused during compilation: '-rdynamic'
It is a pretty trivial warning, but I decided to dig in the warning to solve it.
First, I googled the
-rdynamic option, which is the cause of the warning.
According to GNU GCC’s online docs,
Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of dlopen or to allow obtaining backtraces from within a program.
So, it seems the
-rdynamic options is one for linker. Ok, next, what is
-export-dynamic option then?
When creating a dynamically linked executable, add all symbols to the dynamic symbol table. The dynamic symbol table is the set of symbols which are visible from dynamic objects at run time. If you do not use this option, the dynamic symbol table will normally contain only those symbols which are referenced by some dynamic object mentioned in the link. If you use dlopen to load a dynamic object which needs to refer back to the symbols defined by the program, rather than some other dynamic object, then you will probably need to use this option when linking the program itself.
Ok, I’d say this option can be used when I use
Why the warning is thrown?
Probably, my guess is on my machine, which is macOS Sierra Version 10.12.2, the used compiler is LLVM. I found a question related to this warning on stackoverflow:
So, the solution is
-Wl,-export_dynamic. However, after fixing this, another warning is thrown.
clang: warning: -Wl,-export_dynamic: 'linker' input unused
To fix the warning, I found this question: how to suppress “linker file unused” when compiling. So, the solution is not to pass linker options here.
There’re soooooo many LLVM/Clang compiler options.
Note to myself
The following are what I should check more. I will do them sometime later.
- What is ELF Linker?
- What is dynamic symbol table?
- What is symbol?
- Why does an option sometimes have single dash and double dashes?