What Does Exactly the Warning Mean About Hidden Symbol Being Referenced by Dso

What does exactly the warning mean about hidden symbol being referenced by DSO?

What is a DSO?

A DSO is a Dynamic Shared Object, or less formally a shared library.

What is a hidden symbol?

A hidden symbol is a symbol (i.e. name of function or data object) that
has been compiled with hidden linkage, e.g. as per the (GCC specific)
declaration:

int x __attribute__ ((visibility ("hidden")));

If x is defined in one DSO then dynamic linkage cannot reference it from a
different DSO. The linker can see x (it is not static), but it is not
available for dynamic linkage. Documentation here

How can it be referenced, if it's hidden?

It can't be, which is what you are being warned about. E.g. the linktime warning:

hidden symbol `stat' in /usr/lib/libc_nonshared.a(stat.oS) is referenced by DSO

is telling you that a DSO in the linkage references the symbol stat, and
the linker can locate a definition of stat in /usr/lib/libc_nonshared.a,
but (obviously) that definition is not in the DSO that references it
and cannot be referenced from that DSO, because it is hidden.

You get this problem if the problem DSO has not been built correctly for use
as a DSO. See this example
and follow the follow-ups for the solution.

Continued for OP's followups

If hidden symbol is already referenced by some DSO, then why the problem is with DSO?

The linker is saying:

The DSO X contains a reference to symbol S. I can find a definition of symbol S is another linked module Y,
but that definition will not be available to satisfy the reference in X dynamically (i.e. at runtime) because S has hidden linkage in Y.

I can confirm that the problem comes with a non-shared object [...][but] I don't explicitly hide those symbols in my non-shared object.

You may not have explicitly marked any symbols hidden in the non-shared object. Depending on how it was built, symbols
may be hidden by default unless explicitly marked otherwise.

Say the non-shared object is libnonshared.a and the allegedly hidden symbol is foo. Run:

objdump -t libnonshared.a

to get info about the symbols in libnonshared.a. In the output, look for the entry for foo. Does it contain the tag .hidden? - e.g.

0000000000000000 g     F .text  000000000000000b .hidden foo

This entry says that foo is a global symbol (marked g - that's why the linker is able to see it) but it's hidden for dynamic linkage.

If this turns out to be the case then you need to go and fix the build of libnonshared.a so that it doesn't hide foo.
If not, then I'm stumped.

Error Cross Compiling: hidden symbol ... final link failed

Please check all the libraries that you use and go through this stackoverflow thread as well.

To me, I got the below error when I migrated my product to new GCC version (3.3.3 to 4.5.4)

hidden symbol `__clz_tab' in /../lib/gcc/mipsel-unknown-linux-uclibc/4.5.4/libgcc.a(_clz.o) is referenced by DSO

Later I found that one of the library that I tried to link was built using GCC 3.3.3. After building the other library under GCC 4.5.4, the 'hidden symbol' error disappeared.

OpenCV build G++ symbol error/DSO error

The -l<library> flags need to follow the source or object (.o) file that uses them.

This is how the linker works: it processes the .cpp/.o files from command line left to right, and does not know what it needs from the libraries until it sees them referenced to in an .cpp/.o file.

So change the linker command:

g++ -Wall -I/usr/local/include -lopencv_core -lwiringPi -lpigpio -lopencv_imgcodecs -lopencv_highgui -lopencv_videoio -lopencv_imgproc -o "SdCar" "SdCar.cpp"

to

g++ -Wall -I/usr/local/include  -o "SdCar" "SdCar.cpp" -lopencv_core -lwiringPi -lpigpio -lopencv_imgcodecs -lopencv_highgui -lopencv_videoio -lopencv_imgproc


Related Topics



Leave a reply



Submit