Why is the first C++ (m)allocation always 72 KB?

(joelsiks.com)

59 points | by joelsiks 4 hours ago

2 comments

  • Joker_vD 44 minutes ago
    Huh. Why is this emergency pool not statically allocated? Is it possible to tune the size of this pool on libc++ startup somehow? Because otherwise it absolutely should've been statically allocated.
    • joelsiks 25 minutes ago
      I did mention it briefly in the post, but you can opt-in for a fixed-size statically allocated buffer by configuring libstdc++ with --enable-libstdcxx-static-eh-pool. Also, you can opt-out of the pool entirely by configuring the number of objects in the pool to zero with the environment variable GLIBCXX_TUNABLES=glibcxx.eh_pool.obj_count=0.
  • throwaway2037 2 hours ago
    I would like the see the source code for libmymalloc.so, however, I don't see anything in the blog post. Nor do I see anything in his GitHub profile: https://github.com/jsikstro

    Also, I cannot find his email address anywhere (to ask him to share it on GitHub).

    Am I missing something?

    • joelsiks 1 hour ago
      The exact implementation of mymalloc isn't relevant to the post. I have an old allocator published at https://github.com/joelsiks/jsmalloc that I did as part of my Master's thesis, which uses a similar debug-logging mechanism that is described in the post.
    • nly 1 hour ago
      dlsym() with the RTLD_NEXT flag basically:

      https://catonmat.net/simple-ld-preload-tutorial-part-two

      There's actually a better way to hook GNUs malloc:

      https://www.man7.org/linux/man-pages/man3/malloc_hook.3.html

      This is better because you can disable the hook inside the callback, and therefore use malloc within your malloc hook (no recursion)

      But you can't use this mechanism before main()

      • Joker_vD 53 minutes ago

            The use of these hook functions is not safe in multithreaded
            programs, and they are now deprecated.  From glibc 2.24 onwards,
            the __malloc_initialize_hook variable has been removed from the
            API, and from glibc 2.34 onwards, all the hook variables have been
            removed from the API.  Programmers should instead preempt calls to
            the relevant functions by defining and exporting malloc(), free(),
            realloc(), and calloc().