[libc++] Avoid re-exporting a few specific symbols from libc++abi (#109054)
In 6a884a9aef39, I synchronized the export list of libc++abi to the export list of libc++. From the linker's perspective, this caused these symbols to be taken from libc++.dylib instead of libc++abi.dylib. However, that can be problematic when back-deploying. Indeed, this means that the linker will encode an undefined reference to be fullfilled by libc++.dylib, but when backdeploying against an older system, that symbol might only be available in libc++abi.dylib. Most of the symbols that started being re-exported after 6a884a9aef39 turn out to be implementation details of libc++abi, so nobody really depends on them and this back-deployment issue is inconsequential. However, we ran into issues with a few of these symbols while testing LLVM 19, which led to this patch. This slipped between the cracks and that is why the patch is coming so long after the original patch landed. In the future, a follow-up cleanup would be to stop exporting most of the _cxxabiv1_foo_type_infoE symbols from both libc++abi and libc++ since they are implementation details that nobody should be relying on. rdar://131984512
This commit is contained in:
parent
bb78a0b334
commit
677e8cd6ff
@ -16,6 +16,36 @@ New entries should be added directly below the "Version" header.
|
|||||||
Version 19.0
|
Version 19.0
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
* [libc++] Avoid re-exporting a few specific symbols from libc++abi
|
||||||
|
|
||||||
|
In 6a884a9aef39, I synchronized the export list of libc++abi to the
|
||||||
|
export list of libc++. From the linker's perspective, this caused
|
||||||
|
these symbols to be taken from libc++.dylib instead of libc++abi.dylib.
|
||||||
|
|
||||||
|
However, that can be problematic when back-deploying. Indeed, this means
|
||||||
|
that the linker will encode an undefined reference to be fullfilled by
|
||||||
|
libc++.dylib, but when backdeploying against an older system, that symbol
|
||||||
|
might only be available in libc++abi.dylib.
|
||||||
|
|
||||||
|
Most of the symbols that started being re-exported after 6a884a9aef39
|
||||||
|
turn out to be implementation details of libc++abi, so nobody really
|
||||||
|
depends on them and this back-deployment issue is inconsequential.
|
||||||
|
|
||||||
|
However, we ran into issues with a few of these symbols while testing
|
||||||
|
LLVM 19, which led to this patch.
|
||||||
|
|
||||||
|
In the future, a follow-up cleanup would be to stop exporting most of
|
||||||
|
the _cxxabiv1_foo_type_infoE symbols from both libc++abi and libc++
|
||||||
|
since they are implementation details that nobody should be relying
|
||||||
|
on.
|
||||||
|
|
||||||
|
<arch>-apple-darwin
|
||||||
|
-------------------
|
||||||
|
Symbol not reexported anymore: ___cxa_rethrow_primary_exception
|
||||||
|
Symbol not reexported anymore: __ZTIN10__cxxabiv117__class_type_infoE
|
||||||
|
Symbol not reexported anymore: __ZTIN10__cxxabiv120__si_class_type_infoE
|
||||||
|
Symbol not reexported anymore: __ZTIN10__cxxabiv121__vmi_class_type_infoE
|
||||||
|
|
||||||
* [libc++] Always keep libc++abi re-exports up-to-date
|
* [libc++] Always keep libc++abi re-exports up-to-date
|
||||||
|
|
||||||
This patch makes sure that the set of libc++abi symbols re-exported from libc++
|
This patch makes sure that the set of libc++abi symbols re-exported from libc++
|
||||||
|
@ -78,12 +78,9 @@
|
|||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv116__enum_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv116__enum_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv116__shim_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv116__shim_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__array_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__array_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__class_type_infoE', 'type': 'U'}
|
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__pbase_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__pbase_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv119__pointer_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv119__pointer_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv120__function_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv120__function_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv120__si_class_type_infoE', 'type': 'U'}
|
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv121__vmi_class_type_infoE', 'type': 'U'}
|
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv123__fundamental_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv123__fundamental_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv129__pointer_to_member_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv129__pointer_to_member_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIPDh', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIPDh', 'type': 'U'}
|
||||||
@ -2002,12 +1999,9 @@
|
|||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv116__enum_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv116__enum_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv116__shim_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv116__shim_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__array_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__array_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__class_type_infoE', 'type': 'I'}
|
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__pbase_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__pbase_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv119__pointer_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv119__pointer_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv120__function_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv120__function_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv120__si_class_type_infoE', 'type': 'I'}
|
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv121__vmi_class_type_infoE', 'type': 'I'}
|
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv123__fundamental_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv123__fundamental_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv129__pointer_to_member_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv129__pointer_to_member_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTINSt12experimental15fundamentals_v112bad_any_castE', 'size': 0, 'type': 'OBJECT'}
|
{'is_defined': True, 'name': '__ZTINSt12experimental15fundamentals_v112bad_any_castE', 'size': 0, 'type': 'OBJECT'}
|
||||||
@ -2615,7 +2609,6 @@
|
|||||||
{'is_defined': True, 'name': '___cxa_new_handler', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_new_handler', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_pure_virtual', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_pure_virtual', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_rethrow', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_rethrow', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_rethrow_primary_exception', 'type': 'I'}
|
|
||||||
{'is_defined': True, 'name': '___cxa_terminate_handler', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_terminate_handler', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_throw', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_throw', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_throw_bad_array_new_length', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_throw_bad_array_new_length', 'type': 'I'}
|
||||||
|
@ -78,12 +78,9 @@
|
|||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv116__enum_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv116__enum_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv116__shim_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv116__shim_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__array_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__array_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__class_type_infoE', 'type': 'U'}
|
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__pbase_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv117__pbase_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv119__pointer_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv119__pointer_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv120__function_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv120__function_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv120__si_class_type_infoE', 'type': 'U'}
|
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv121__vmi_class_type_infoE', 'type': 'U'}
|
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv123__fundamental_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv123__fundamental_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIN10__cxxabiv129__pointer_to_member_type_infoE', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIN10__cxxabiv129__pointer_to_member_type_infoE', 'type': 'U'}
|
||||||
{'is_defined': False, 'name': '__ZTIPDh', 'type': 'U'}
|
{'is_defined': False, 'name': '__ZTIPDh', 'type': 'U'}
|
||||||
@ -2002,12 +1999,9 @@
|
|||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv116__enum_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv116__enum_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv116__shim_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv116__shim_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__array_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__array_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__class_type_infoE', 'type': 'I'}
|
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__pbase_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv117__pbase_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv119__pointer_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv119__pointer_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv120__function_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv120__function_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv120__si_class_type_infoE', 'type': 'I'}
|
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv121__vmi_class_type_infoE', 'type': 'I'}
|
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv123__fundamental_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv123__fundamental_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTIN10__cxxabiv129__pointer_to_member_type_infoE', 'type': 'I'}
|
{'is_defined': True, 'name': '__ZTIN10__cxxabiv129__pointer_to_member_type_infoE', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '__ZTINSt12experimental15fundamentals_v112bad_any_castE', 'size': 0, 'type': 'OBJECT'}
|
{'is_defined': True, 'name': '__ZTINSt12experimental15fundamentals_v112bad_any_castE', 'size': 0, 'type': 'OBJECT'}
|
||||||
@ -2649,7 +2643,6 @@
|
|||||||
{'is_defined': True, 'name': '___cxa_new_handler', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_new_handler', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_pure_virtual', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_pure_virtual', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_rethrow', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_rethrow', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_rethrow_primary_exception', 'type': 'I'}
|
|
||||||
{'is_defined': True, 'name': '___cxa_terminate_handler', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_terminate_handler', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_throw', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_throw', 'type': 'I'}
|
||||||
{'is_defined': True, 'name': '___cxa_throw_bad_array_new_length', 'type': 'I'}
|
{'is_defined': True, 'name': '___cxa_throw_bad_array_new_length', 'type': 'I'}
|
||||||
|
@ -2,12 +2,9 @@
|
|||||||
__ZTIN10__cxxabiv116__enum_type_infoE
|
__ZTIN10__cxxabiv116__enum_type_infoE
|
||||||
__ZTIN10__cxxabiv116__shim_type_infoE
|
__ZTIN10__cxxabiv116__shim_type_infoE
|
||||||
__ZTIN10__cxxabiv117__array_type_infoE
|
__ZTIN10__cxxabiv117__array_type_infoE
|
||||||
__ZTIN10__cxxabiv117__class_type_infoE
|
|
||||||
__ZTIN10__cxxabiv117__pbase_type_infoE
|
__ZTIN10__cxxabiv117__pbase_type_infoE
|
||||||
__ZTIN10__cxxabiv119__pointer_type_infoE
|
__ZTIN10__cxxabiv119__pointer_type_infoE
|
||||||
__ZTIN10__cxxabiv120__function_type_infoE
|
__ZTIN10__cxxabiv120__function_type_infoE
|
||||||
__ZTIN10__cxxabiv120__si_class_type_infoE
|
|
||||||
__ZTIN10__cxxabiv121__vmi_class_type_infoE
|
|
||||||
__ZTIN10__cxxabiv123__fundamental_type_infoE
|
__ZTIN10__cxxabiv123__fundamental_type_infoE
|
||||||
__ZTIN10__cxxabiv129__pointer_to_member_type_infoE
|
__ZTIN10__cxxabiv129__pointer_to_member_type_infoE
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@ ___cxa_guard_acquire
|
|||||||
___cxa_guard_release
|
___cxa_guard_release
|
||||||
___cxa_increment_exception_refcount
|
___cxa_increment_exception_refcount
|
||||||
___cxa_pure_virtual
|
___cxa_pure_virtual
|
||||||
___cxa_rethrow_primary_exception
|
|
||||||
___cxa_throw_bad_array_new_length
|
___cxa_throw_bad_array_new_length
|
||||||
___cxa_uncaught_exception
|
___cxa_uncaught_exception
|
||||||
___cxa_uncaught_exceptions
|
___cxa_uncaught_exceptions
|
||||||
|
13
libcxxabi/lib/symbols-not-reexported.exp
Normal file
13
libcxxabi/lib/symbols-not-reexported.exp
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# These symbols are not re-exported from libc++ because providing a definition in libc++ causes
|
||||||
|
# issues with some clients when backdeploying.
|
||||||
|
|
||||||
|
# These symbols are implementation details of libc++abi, but they are referenced from UBSan
|
||||||
|
# (which is a total hack). We'll need to figure out how to decouple UBSan from these details
|
||||||
|
# before we can stop exporting them from libc++abi.
|
||||||
|
__ZTIN10__cxxabiv117__class_type_infoE
|
||||||
|
__ZTIN10__cxxabiv120__si_class_type_infoE
|
||||||
|
__ZTIN10__cxxabiv121__vmi_class_type_infoE
|
||||||
|
|
||||||
|
# This symbol is not an implementation detail of libc++abi, but it also causes issues when moving
|
||||||
|
# to libc++. This needs further investigation.
|
||||||
|
___cxa_rethrow_primary_exception
|
@ -214,14 +214,22 @@ if (LIBCXXABI_ENABLE_SHARED)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(cxxabi-reexports INTERFACE)
|
add_library(cxxabi-reexports INTERFACE)
|
||||||
function(reexport_symbols file)
|
function(export_symbols file)
|
||||||
# -exported_symbols_list is only available on Apple platforms
|
# -exported_symbols_list is only available on Apple platforms
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${file}")
|
target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${file}")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(reexport_symbols file)
|
||||||
|
export_symbols("${file}")
|
||||||
|
# -reexported_symbols_list is only available on Apple platforms
|
||||||
|
if (APPLE)
|
||||||
target_link_libraries(cxxabi-reexports INTERFACE "-Wl,-reexported_symbols_list,${file}")
|
target_link_libraries(cxxabi-reexports INTERFACE "-Wl,-reexported_symbols_list,${file}")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
export_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/symbols-not-reexported.exp")
|
||||||
reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/cxxabiv1.exp")
|
reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/cxxabiv1.exp")
|
||||||
reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/fundamental-types.exp")
|
reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/fundamental-types.exp")
|
||||||
reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/itanium-base.exp")
|
reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/itanium-base.exp")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user