<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;
      charset=windows-1252">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 2021-08-09 7:39 a.m., Louis Dionne
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:A3A579B2-BC77-4040-A875-DBB24E14E969@apple.com">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252">
      <br class="">
      <div><br class="">
        <blockquote type="cite" class="">
          <div class="">On Aug 6, 2021, at 09:34, Ken Cunningham <<a
              href="mailto:ken.cunningham.webuse@gmail.com" class=""
              moz-do-not-send="true">ken.cunningham.webuse@gmail.com</a>>
            wrote:</div>
          <br class="Apple-interchange-newline">
          <div class="">
            <div dir="ltr" class=""><br class="">
            </div>
            <br class="">
            <div class="gmail_quote">
              <div dir="ltr" class="gmail_attr">On Thu, Jul 22, 2021 at
                2:08 PM Louis Dionne via libcxx-dev <<a
                  href="mailto:libcxx-dev@lists.llvm.org"
                  target="_blank" class="" moz-do-not-send="true">libcxx-dev@lists.llvm.org</a>>
                wrote:<br class="">
              </div>
              <blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
                <div
                  style="word-wrap:break-word;line-break:after-white-space"
                  class=""><br class="">
                  <div class=""><br class="">
                    <blockquote type="cite" class="">
                      <div class="">On Jul 10, 2021, at 09:33, Isuru
                        Fernando via libcxx-dev <<a
                          href="mailto:libcxx-dev@lists.llvm.org"
                          target="_blank" class=""
                          moz-do-not-send="true">libcxx-dev@lists.llvm.org</a>>
                        wrote:</div>
                      <br class="">
                      <div class="">
                        <div dir="ltr" class="">
                          <div class="">Hi Ken,<br class="">
                            <br class="">
                            I'm in the same situation as you in conda
                            package manager.<br class="">
                            Note that with libcxx 12, <a
                              href="https://reviews.llvm.org/D91517"
                              target="_blank" class=""
                              moz-do-not-send="true">https://reviews.llvm.org/<wbr
                                class="">D91517</a> was merged where
                            <div class="">codecvt with char8_t is added
                              in the middle of a structure instead of at
                              the end.<br class="">
                            </div>
                            <div class="">This means that you have to be
                              careful that all applications link to the
                              custom libc++.<br class="">
                              <br class="">
                            </div>
                            <div class="">For libcxx developers,</div>
                            <div class="">
                              <div class="">While we are discussing how
                                to avoid ODR violations, is it possible
                                to move the two lines at<br class="">
                                <a
href="https://github.com/llvm/llvm-project/blob/llvmorg-12.0.1/libcxx/src/locale.cpp#L210-L211"
                                  target="_blank" class=""
                                  moz-do-not-send="true">https://github.com/llvm/llvm-<wbr
                                    class="">project/blob/llvmorg-12.0.1/<wbr
                                    class="">libcxx/src/locale.cpp#L210-<wbr
                                    class="">L211 </a><br class="">
                              </div>
                              <div class="">to the bottom to avoid
                                segfaults resulting from this?<br
                                  class="">
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                    </blockquote>
                    <div class=""><br class="">
                    </div>
                    <div class="">Generally speaking, we make the
                      assumption that there's a single copy of libc++ in
                      use inside a final linked image. Or if you want to
                      use libc++ as an implementation detail and link it
                      statically, ensure it doesn't export any symbols
                      and has absolutely no ABI surface outside of the
                      executable where it's being used. Chrome does
                      that.</div>
                    <div class=""><br class="">
                    </div>
                    <div class="">Anything else is very brittle, and I'm
                      reluctant to add workarounds that make it look
                      like it works, because you may run into other
                      issues that we won't be able to patch so easily.</div>
                    <div class=""><br class="">
                    </div>
                    <div class="">Louis</div>
                  </div>
                </div>
                <br class="">
              </blockquote>
            </div>
            <div class=""><br class="">
            </div>
            <div class="">I had thought libc++ was more immune to this
              kind of problem given Apple's usual support to deploy on
              older systems.</div>
          </div>
        </blockquote>
        <div><br class="">
        </div>
        <div>It can't really be immune to those problems since they are
          byproducts of how linking works at a pretty fundamental level.
          Back-deploying to older platforms works nicely as long as you
          use the libc++ shipped with the system (we make sure of that),
          or that you "embed" libc++ into your application by linking it
          as a static archive and disregard the system libc++ altogether
          (Chrome does that). When you do something in-between, that's
          when things start failing.</div>
        <div><br class="">
        </div>
        <blockquote type="cite" class="">
          <div class="">
            <div class=""><br class="">
            </div>
            <div class="">If the libc++ structures have changed and are
              now incompatible with previous versions of libc++, would
              that now mean that an Apple build system using the new
              libc++ structures can no longer target a deployment target
              with an older libc++ (any system prior to the change)?</div>
          </div>
        </blockquote>
        <div><br class="">
        </div>
        <div>There was no ABI breaking change to the libc++ structures
          in <a href="https://reviews.llvm.org/D91517" class=""
            moz-do-not-send="true">https://reviews.llvm.org/D91517</a>.
          We still support the same back-deployment targets as before.</div>
        <div><br class="">
        </div>
        <div>Louis</div>
        <div><br class="">
        </div>
      </div>
    </blockquote>
    <p><br>
    </p>
    <p>Thanks for taking a moment to respond. I always appreciate the
      feedback and knowledge I receive here from you and others, and TBH
      I am usually reluctant to ask many questions, recognizing the
      rarefied air around this place. Despite that, I will humbly ask:<br>
    </p>
    <p><br>
    </p>
    <p>Isuru notes that the facet structure in libc++ used to be ABCD,
      and now as of D91517 it is ABCFD, with a new set of fields in the
      middle. He notes crashes when mixing binaries built against before
      and after D91517 versions of libc++, which is fair enough and easy
      to understand.<br>
    </p>
    <p><br>
    </p>
    <p>However, If you build against libc++ headers with the ABCFD
      version of that facet structure, and link either statically or
      dynamically (it would seem to not matter which) to a libc++ that
      was built with an ABCFD facet structure, then your application
      will be passing around ABCFD facet objects.</p>
    <p><br>
    </p>
    <p>If you then deploy onto a system with the older ABCD facet
      structure in libc++, and you try to pass that ABCFD facet object
      to any system framework or library to do something with, will you
      not be in ODR-violation territory?</p>
    <p><br>
    </p>
    <p>(If this is a CS-101 level question that is just obvious to
      everyone, I will take it over to StackOverflow :> )<br>
    </p>
    <p>Ken<br>
    </p>
  </body>
</html>