Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ODR issue for gcc san with CRAN version #152

Open
mattfidler opened this issue Feb 1, 2021 · 5 comments
Open

ODR issue for gcc san with CRAN version #152

mattfidler opened this issue Feb 1, 2021 · 5 comments

Comments

@mattfidler
Copy link

I am getting the following ODR violation; CRAN asked me to fix ODR violations in my package, and this one came up:

==136164==ERROR: AddressSanitizer: odr-violation (0x7efd2f2f1240):
  [1] size=168 '__itt__ittapi_global' ../../src/tbb/tools_api/ittnotify_static.c:231:14
  [2] size=168 '__itt__ittapi_global' ../../src/tbb/tools_api/ittnotify_static.c:231:14
These globals were registered at these points:
  [1]:
    #0 0x7efd3c896b78  (/usr/lib/x86_64-linux-gnu/libasan.so.6+0x37b78)
    #1 0x7efd2f24ab91 in _sub_I_00099_1 (/usr/local/RDsan/lib/R/site-library/RcppParallel/lib/libtbbmalloc.so.2+0xd6b91)
    #2 0x7efd3d244dbd  (/lib64/ld-linux-x86-64.so.2+0x11dbd)

  [2]:
    #0 0x7efd3c896b78  (/usr/lib/x86_64-linux-gnu/libasan.so.6+0x37b78)
    #1 0x7efd2f5dec70 in _sub_I_00099_1 (/usr/local/RDsan/lib/R/site-library/RcppParallel/lib/libtbb.so.2+0x240c70)
    #2 0x7efd3d244dbd  (/lib64/ld-linux-x86-64.so.2+0x11dbd)
@kevinushey
Copy link
Contributor

This is because both tbb and tbbmalloc define the (identical) object here:

/* static part descriptor which handles. all notification api attributes. */
__itt_global _N_(_ittapi_global) = {
ITT_MAGIC, /* identification info */
ITT_MAJOR, ITT_MINOR, API_VERSION_BUILD, /* version info */
0, /* api_initialized */
0, /* mutex_initialized */
0, /* atomic_counter */
MUTEX_INITIALIZER, /* mutex */
NULL, /* dynamic library handle */
NULL, /* error_handler */
(const char**)&dll_path, /* dll_path_ptr */
(__itt_api_info*)&api_list, /* api_list_ptr */
NULL, /* next __itt_global */
NULL, /* thread_list */
NULL, /* domain_list */
NULL, /* string_list */
__itt_collection_normal /* collection state */
};

I tried playing around to see if there was a simple way to avoid that collision, but I couldn't find anything on first glance.

@mattfidler
Copy link
Author

mattfidler commented Apr 15, 2021

For some reason, some compiled optimized versions do not see this ODR violation; I think it doesn't (yet) occur with CRAN.

@kevinushey
Copy link
Contributor

kevinushey commented Apr 15, 2021

It does; the CRAN team has notified me already. And it's apparent because that same symbol is defined in both libraries:

$ nm libtbb.dylib | grep ittapi_global
00000000000268e0 d ___itt__ittapi_global
$ nm libtbbmalloc.dylib | grep ittapi_global
0000000000015c30 d ___itt__ittapi_global

I'm not sure what the right fix is on TBB's side, though. Should they be sharing a single definition? Should the name of the version in tbbmalloc be different?

@mattfidler
Copy link
Author

I am unsure too. We simply redefined for each binary that we produced. If you follow that approach you would pick one and change any name that refers to it. This could probably by some build script.

@kevinushey
Copy link
Contributor

Note to self, the solution here is probably to try defining INTEL_ITTNOTIFY_PREFIX differently for tbb + tbbmalloc:

#ifndef INTEL_ITTNOTIFY_PREFIX
# define INTEL_ITTNOTIFY_PREFIX __itt_
#endif /* INTEL_ITTNOTIFY_PREFIX */
#ifndef INTEL_ITTNOTIFY_POSTFIX
# define INTEL_ITTNOTIFY_POSTFIX _ptr_
#endif /* INTEL_ITTNOTIFY_POSTFIX */

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants