Bug 82956 - Incorrect relocation emitted (symbol considered external) due to inlining and hidden visibility.
Summary: Incorrect relocation emitted (symbol considered external) due to inlining and...
Status: UNCONFIRMED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 7.2.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: visibility, wrong-code
Depends on:
Blocks: visibility
  Show dependency treegraph
 
Reported: 2017-11-12 17:09 UTC by Ray Donnelly
Modified: 2021-09-17 00:10 UTC (History)
0 users

See Also:
Host: x86_64-pc-linux-gnu
Target: x86_64-pc-linux-gnu
Build: x86_64-pc-linux-gnu
Known to work:
Known to fail:
Last reconfirmed:


Attachments
testcase.cc (262 bytes, text/plain)
2017-11-12 17:09 UTC, Ray Donnelly
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Ray Donnelly 2017-11-12 17:09:28 UTC
Created attachment 42590 [details]
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).