Symbols collision not reported

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi guys,
 I had a problem during a C application development because of a
collision between symbols NOT reported (no warnings or errors)
by the linker.

. The application uses libmysqlclient library.
. The applcation declares a global int variable named shutdown:
   /* mysql_test.c file */
   int shutdwon;
. libmysqlclient declares a function, named vio_close(), that calls
  the shutdown() function placed in the libc shared library;

When linking using libmysqlclient as shared library everything is fine.
When linking using libmysqlclient as static library the linker uses the
 shutdown variable address instead of shutdown() function address inside
 vio_close() without reporting any warning or error.

The application is built using:
  gcc -lm -g mysql_test.c libmysqlclient.a -o mysql_test

Debugging with gdb:
(gdb) break vio_close
Breakpoint 1 at 0x8077862: file viosocket.c, line 268.
(gdb) run
Breakpoint 1, vio_close (vio=0x81ee0b0) at viosocket.c:268
268     viosocket.c: No such file or directory.
        in viosocket.c
(gdb) disassemble
Dump of assembler code for function vio_close:
 . . . CUT . . .
0x08077883 <vio_close+51>:      call   0x81ec610 <shutdown>
 . . . CUT . . .
End of assembler dump.
(gdb) print &'mysql_test.c'::shutdown
$1 = (int *) 0x81ec610

Ok, the solution is to declare the global shutdown variable static,
since it is used only inside mysql_test.c, but what I wanna know is if
it is correct that in this situation the linker is not able to
recognise the right symbol, or if this not-reported collision is a
linker bug.

 Matteo



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux