public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Problem with static const objects and LTO
@ 2020-09-16 16:51 Jeff Law
  2020-09-16 17:05 ` H.J. Lu
  2020-09-16 17:52 ` Joseph Myers
  0 siblings, 2 replies; 17+ messages in thread
From: Jeff Law @ 2020-09-16 16:51 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 2026 bytes --]


Consider a TU with file scoped "static const object utf8_sb_map".   A
routine within the TU will stuff &utf8_sb_map into an object, something
like:

fu (...)

{

  if (cond)

    dfa->sb_char = utf8_sb_map;

  else

    dfa->sb_char = malloc (...);

}


There is another routine in the TU which looks like

bar (...)

{

  if (dfa->sb_char != utf8_sb_map)

    free (dfa->sb_char);

}


Now imagine that the TU is compiled (with LTO) into a static library,
libgl.a and there's a DSO (libdso.so) which gets linked against libgl.a
and references the first routine (fu).  We get a copy of fu in the DSO
along with a copy of utf8_sb_map.


Then imagine there's a main executable that dynamicly links against
libdso.so, then links statically against libgl.a.  Assume the  main
executable does not directly reference fu(), but does call a routine in
libdso.so which eventually calls fu().  Also assume the main executable
directly calls bar().  Again, remember we're compiling with LTO, so we
don't suck in the entire TU, just the routines/data we need.


In this scenario, both libdso.so and the main executable are going to a
copy of utf8_sb_map and they'll be at different addresses.  So when the
main executable calls into libdso.so which in turn calls libdso's copy
of fu() which stuffs the address of utf8_sb_map from the DSO into
dfa->sb_char.  Later the main executable calls bar() that's in the main
executable.  It does the comparison to see if dfa->sb_char is equal to
utf8_sb_map -- but it's using the main executable's copy of utf8_sb_map
and naturally free() blows us because it was passed a static object, not
a malloc'd object.


ISTM this is a lot like the problem we have where we inline functions
with static data.   To fix those we use STB_GNU_UNIQUE.  But I don't see
any code in the C front-end which would utilize STB_GNU_UNIQUE.  It's
support seems limited to C++.


How is this supposed to work for C?


Jeff



[-- Attachment #2: pEpkey.asc --]
[-- Type: application/pgp-keys, Size: 1763 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2020-10-09 18:36 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-16 16:51 Problem with static const objects and LTO Jeff Law
2020-09-16 17:05 ` H.J. Lu
2020-09-16 17:10   ` Jeff Law
2020-09-16 17:13     ` H.J. Lu
2020-09-16 17:24       ` Jeff Law
2020-09-16 17:32         ` H.J. Lu
2020-09-16 17:41           ` Jeff Law
2020-09-16 17:52 ` Joseph Myers
2020-09-16 20:24   ` Jeff Law
2020-09-17  7:04     ` Richard Biener
2020-09-17 18:18       ` Jeff Law
2020-09-17 19:03         ` Jakub Jelinek
2020-10-07 22:08           ` Jeff Law
2020-10-07 22:09             ` Jeff Law
2020-10-07 23:12               ` H.J. Lu
2020-10-07 23:16                 ` Jeff Law
2020-10-09 18:36                 ` Jeff Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).