Bug #90155 Should set my_* code/function as local symbol
Submitted: 21 Mar 2018 8:33 Modified: 22 Mar 2018 6:59
Reporter: Jiajing Zhou Email Updates:
Status: Verified Impact on me:
None 
Category:Connector / ODBC Severity:S5 (Performance)
Version:5.3.10 OS:Any
Assigned to: CPU Architecture:Any
Tags: global, local, nm, symbol

[21 Mar 2018 8:33] Jiajing Zhou
Description:
In the Connector/ODBC,many function symbos are global.

For example,  executed command "nm" (notice uppercase *T*) :

~~~bash
$> nm libmyodbc5a.so | grep " my_malloc"
00000000000c2030 T my_malloc
00000000000bc500 t my_malloc_c
~~~

U can find out that the function my_malloc is a *global* symbol. So if my project has a function named my_malloc,  the odbc SQL* function may call my_malloc with wrong localtion.

# C API

Refer to libmysqlclient, the function my_malloc is a *local* symbol.

~~~bash
> nm libmysqlclient.so | grep my_malloc
00000000000643b0 t my_malloc
000000000005e790 t my_malloc_c
~~~

How to repeat:
Just use command : nm libmyodbc5a.so | grep " my_malloc" | grep " T "

Suggested fix:
1. Modified: driver/CMakeLists.txt

+
+SET(libmyodbc_link_flags
+    " -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/myodbc5.ver")
+
+SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${libmyodbc_link_flags}")
+

2. add file: driver/myodbc5.ver
@@ -0,0 +1,7 @@
+{ 
+        global: SQL*;
+        local: *;
+ };

3. compile, then execute command: nm libmyodbc5a.so | grep " T " 
U will just find that the global functions  are all started with "SQL". 

See the whole diff:

diff --git a/driver/CMakeLists.txt b/driver/CMakeLists.txt
index 7bf2486..a5a9bbb 100644
--- a/driver/CMakeLists.txt
+++ b/driver/CMakeLists.txt
@@ -40,6 +40,12 @@ SET(DRIVER_LOCATION2 "")
 SET(CONNECTOR_DRIVER_TYPE2 "")
 SET(CONNECTOR_DRIVER_TYPE_SHORT2 "")

+
+SET(libmyodbc_link_flags
+    " -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/myodbc5.ver")
+
+SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${libmyodbc_link_flags}")
+
 WHILE(${DRIVER_INDEX} LESS ${DRIVERS_COUNT})

   LIST(GET IS_UNICODE_DRIVER ${DRIVER_INDEX} UNICODE)
@@ -119,12 +125,16 @@ ENDIF()
     ENDIF()

     SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ODBC_DRIVER_LINK_FLAGS}")
+    
+
     TARGET_LINK_LIBRARIES(${DRIVER_NAME}
                           ${MYSQL_CLIENT_LIBS} ${CMAKE_THREAD_LIBS_INIT} m)
     TARGET_LINK_LIBRARIES(${DRIVER_NAME} myodbc-util)

     INCLUDE_DIRECTORIES(${DL_INCLUDES})

+     
+
   ENDIF(WIN32)

   IF (MYSQL_CXX_LINKAGE)
diff --git a/driver/myodbc5.ver b/driver/myodbc5.ver
new file mode 100644
index 0000000..6fd7d59
--- /dev/null
+++ b/driver/myodbc5.ver
@@ -0,0 +1,7 @@
+{ 
+        global: SQL*;
+        local: *;
+ };
[21 Mar 2018 8:37] Jiajing Zhou
my diff file

Attachment: br_loacl_symbol_link.diff (application/octet-stream, text), 1.15 KiB.

[22 Mar 2018 6:59] Bogdan Degtyariov
Hi Jiajing,

Thank you for your report.
This problem is verified.
We should implement the internal functions as local.