https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82956

            Bug ID: 82956
           Summary: Incorrect relocation emitted (symbol considered
                    external) due to inlining and hidden visibility.
           Product: gcc
           Version: 7.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mingw.android at gmail dot com
  Target Milestone: ---

Created attachment 42590
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=42590&action=edit
testcase.cc

I'm not really sure where the fault is here, but I am trying to compile MySQL
with -O -fPIC -fvisibility-inlines-hidden and am running into a failure to
link:

> /opt/conda/conda-bld/mysql_1510280026509/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/bin/x86_64-conda_cos6-linux-gnu-c++
>  -fPIC -fvisibility-inlines-hidden -std=gnu++98 -fmessage-length=0 
> -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong 
> -fno-plt -O2 -pipe -fno-strict-aliasing -Wall -Wextra -Wformat-security -Wvla 
> -Woverloaded-virtual -Wno-unused-parameter -O3 -DNDEBUG -DDBUG_OFF -fPIC   
> -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now 
> -Wl,-rpath,/opt/conda/conda-bld/mysql_1510280026509/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/lib
>  -shared  -o group_replication.so 
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/pax_msg.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_base.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_memory.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_vp_str.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_cfg.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_cache.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_transport.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/node_address.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_msg_queue.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_statistics.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/app_data.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/site_def.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_ssl_transport.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_recover.c.o
>  CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/task.c.o 
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/bitset.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/simset.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/node_set.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_interface.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/node_list.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/task_debug.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/sock_probe.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/task_net.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/synode_no.c.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/xcom/xcom_detector.c.o
>  CMakeFiles/group_replication.dir/xdr_gen/xcom_vp_xdr.c.o 
> CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/gcs_logging.cc.o 
> CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/xplatform/my_xp_cond.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/xplatform/my_xp_thread.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/xplatform/my_xp_mutex.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/xplatform/my_xp_util.cc.o
>  CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/gcs_view.cc.o 
> CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/gcs_types.cc.o 
> CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/gcs_message.cc.o 
> CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/gcs_member_identifier.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/interface/gcs_group_identifier.cc.o
>  CMakeFiles/group_replication.dir/libmysqlgcs/src/gcs_interface_factory.cc.o 
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_communication_interface.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_control_interface.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_group_management.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_internal_message.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_networking.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_utils.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_state_exchange.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_group_member_information.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_message_stages.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_view_identifier.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_interface.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_notification.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_message_stage_lz4.cc.o
>  
> CMakeFiles/group_replication.dir/libmysqlgcs/src/bindings/xcom/gcs_xcom_statistics_interface.cc.o
>  CMakeFiles/group_replication.dir/src/applier.cc.o 
> CMakeFiles/group_replication.dir/src/auto_increment.cc.o 
> CMakeFiles/group_replication.dir/src/certifier.cc.o 
> CMakeFiles/group_replication.dir/src/channel_observation_manager.cc.o 
> CMakeFiles/group_replication.dir/src/delayed_plugin_initialization.cc.o 
> CMakeFiles/group_replication.dir/src/gcs_event_handlers.cc.o 
> CMakeFiles/group_replication.dir/src/gcs_logger.cc.o 
> CMakeFiles/group_replication.dir/src/gcs_operations.cc.o 
> CMakeFiles/group_replication.dir/src/gcs_plugin_messages.cc.o 
> CMakeFiles/group_replication.dir/src/gcs_view_modification_notifier.cc.o 
> CMakeFiles/group_replication.dir/src/group_partition_handling.cc.o 
> CMakeFiles/group_replication.dir/src/member_info.cc.o 
> CMakeFiles/group_replication.dir/src/observer_server_actions.cc.o 
> CMakeFiles/group_replication.dir/src/observer_server_channels.cc.o 
> CMakeFiles/group_replication.dir/src/observer_server_state.cc.o 
> CMakeFiles/group_replication.dir/src/observer_trans.cc.o 
> CMakeFiles/group_replication.dir/src/pipeline_factory.cc.o 
> CMakeFiles/group_replication.dir/src/pipeline_stats.cc.o 
> CMakeFiles/group_replication.dir/src/plugin.cc.o 
> CMakeFiles/group_replication.dir/src/plugin_psi.cc.o 
> CMakeFiles/group_replication.dir/src/plugin_utils.cc.o 
> CMakeFiles/group_replication.dir/src/ps_information.cc.o 
> CMakeFiles/group_replication.dir/src/read_mode_handler.cc.o 
> CMakeFiles/group_replication.dir/src/recovery.cc.o 
> CMakeFiles/group_replication.dir/src/recovery_channel_state_observer.cc.o 
> CMakeFiles/group_replication.dir/src/applier_channel_state_observer.cc.o 
> CMakeFiles/group_replication.dir/src/asynchronous_channels_state_observer.cc.o
>  CMakeFiles/group_replication.dir/src/recovery_message.cc.o 
> CMakeFiles/group_replication.dir/src/recovery_state_transfer.cc.o 
> CMakeFiles/group_replication.dir/src/replication_threads_api.cc.o 
> CMakeFiles/group_replication.dir/src/single_primary_message.cc.o 
> CMakeFiles/group_replication.dir/src/member_version.cc.o 
> CMakeFiles/group_replication.dir/src/compatibility_module.cc.o 
> CMakeFiles/group_replication.dir/src/handlers/applier_handler.cc.o 
> CMakeFiles/group_replication.dir/src/handlers/certification_handler.cc.o 
> CMakeFiles/group_replication.dir/src/handlers/event_cataloger.cc.o 
> CMakeFiles/group_replication.dir/src/sql_service/sql_resultset.cc.o 
> CMakeFiles/group_replication.dir/src/sql_service/sql_service_context.cc.o 
> CMakeFiles/group_replication.dir/src/sql_service/sql_service_context_base.cc.o
>  CMakeFiles/group_replication.dir/src/sql_service/sql_service_interface.cc.o 
> CMakeFiles/group_replication.dir/src/sql_service/sql_command_test.cc.o 
> CMakeFiles/group_replication.dir/src/sql_service/sql_service_command.cc.o 
> -Wl,-rpath,/opt/conda/conda-bld/mysql_1510280026509/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/lib:
>  -lpthread ../../../libservices/libmysqlservices.a 
> ../../../extra/liblz4_lib.a 
> /opt/conda/conda-bld/mysql_1510280026509/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/lib/libssl.so
>  
> /opt/conda/conda-bld/mysql_1510280026509/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/lib/libcrypto.so
>  -ldl -lpthread 
> /opt/conda/conda-bld/mysql_1510280026509/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.2.0/../../../../x86_64-conda_cos6-linux-gnu/bin/ld:
>  CMakeFiles/group_replication.dir/src/observer_trans.cc.o: relocation 
> R_X86_64_PC32 against undefined symbol 
> `_ZThn120_N14Gtid_log_event13get_data_sizeEv' can not be used when making a 
> shared object; recompile with -fPIC
> /opt/conda/conda-bld/mysql_1510280026509/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.2.0/../../../../x86_64-conda_cos6-linux-gnu/bin/ld:
>  final link failed: Bad value

I am compiling observer_trans.cc with -fPIC, so the advice is not helpful.

I believe Gtid_log_event::get_data_size() got inlined when it should not and
after that, the local reference was considered external and an incorrect
relocation got emitted (or something along those lines).

I used creduce to minimize a testcase (testcase.cc) which I think demonstrates
the problem. Compiling this and inspecting the relocations via:

> g++ -O -fvisibility-inlines-hidden -fPIC -finline -c testcase.cc
> objdump -r testcase.o | grep _ZThn120_N14Gtid_log_event13get_data_sizeEv

.. gives:

> 000000000000003c R_X86_64_PC32     
> _ZThn120_N14Gtid_log_event13get_data_sizeEv-0x0000000000000004
> 0000000000000038 R_X86_64_64       _ZThn120_N14Gtid_log_event13get_data_sizeEv

I can work around this by not passing -fvisibility-inlines-hidden but I would
prefer not to (note that I have not declared anything as inline in the testcase
so it cannot the case that I have some broken inline specifiers around).

Reply via email to