<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/152763>152763</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            undefined symbol: std::__1::basic_streambuf<char, std::__1::char_traits<char>>::seekoff(long, std::__1::ios_base::seekdir, unsigned int) when using libcxx with newlib
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          inglorion
      </td>
    </tr>
</table>

<pre>
    On #131921, it was [noted](https://github.com/llvm/llvm-project/pull/131921#issuecomment-2737539434) that the change caused an undefined symbol in some situations. What happens is that `libcxx_static.a` ends up containing a definition of `std::__1::basic_streambuf<char, std::__1::char_traits<char>>::seekoff(long long, std::__1::ios_base::seekdir, unsigned int)` and a reference to `std::__1::basic_streambuf<char, std::__1::char_traits<char>>::seekoff(long, std::__1::ios_base::seekdir, unsigned int)`. The difference is the type of the first parameter: `long long` vs. `long`.

At link time, this will result in an error such as

```
error: undefined symbol: std::__1::basic_streambuf<char, std::__1::char_traits<char>>::seekoff(long, std::__1::ios_base::seekdir, unsigned int)
```

with references from `vtable for std::__1::__stdinbuf<char>` and similar.

The difference is caused by these lines in `libcxx/include/__fwd/ios.h`:

```
#if defined(_NEWLIB_VERSION)
// On newlib, off_t is 'long int'
using streamoff = long int; // for char_traits in <string>
#elseusing streamoff = long long; // for char_traits in <string> 
#endif
```

On systems with newlib, it is possible to get to this code with or without `_NEWLIB_VERSION` being defined. The inclusion of newlib header files causes `_NEWLIB_VERSION` to be defined, so including libc headers before libcxx headers will cause `_NEWLIB_VERSION` to be defined, resulting in streamoff being `long int`. However, if libcxx headers are included without first including newlib headers, `_NEWLIB_VERSION` will be undefined and streamoff will be `long long`. The inconsistency results in the link error.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUVt2K4zgTfRrlppjgSImTXOQi_RO-gY9p2F12Lo1slePakaWgkjvTb79IdtKZ7hmYZWFhwMRGP1U651SdSDPT0SHuxOpOrB5meoidDztyR-sDeTervXnZPTkQUi3UYisXQt4DRThrBrG6cz6iEasHITddjCcWai_kQcjDkWI31PPG90IerH2-vD6cgv8Lmyjk4TRYK-ThElYR84CN73t08YNcq_VKbZdqKeQWYqcjxA6h6bQ7IjR6YDSgHQzOYEsODfBLX3sL5IB9j8AUBx3JO57D57S906cTOgbiMZwoC0t18_VrxVFHauZalAWgMwzDCRrvoiZH7ggacgpKwcC3aSNHk5CqfVUtxo9aMzUVx4C6r4dWqPum0yGR9X5tmqli0BT5sk495ifNMuIX37ZCbqx3R0g_3w9DnqtaM75uM5QzDi6LaoBcFHKbYGlnQEPAFgO6BiH6_xbGv0Ywhz86BEPtBUGWESG-nDCJkr5bChzhpIPuMWIQap9FvrJYFvDM88tYCiqKvSj2-wiW3BeI1GPKHjtiOJO1EJAHG1NNaQcYgg_AQ9OB5nGnKIvpKfZ5OuV8W5Jp7Jdh-ltMotifKXavhcPQBt8nCp-jri1Cmyh5l66qOBpyN7jU46UMmXqyOkzcv1d16u36JWnKmKRBThJcG1bIA7nGDgaFPFRVezZpxPO8S6dW-_faJHdpYZJFyE316fHz_z_eVX8-_vb7x6dPE_BsXPDkwOHZUp3o8W1bxXQqIde5kDJNa1HsB07eMOrn2xaEeoDrCnUHU7TEz418GYe65xjIHRMp-WxoGX8YL4v60wFhiugMte_FfHLALxyxT_UduxuglFGePDMlWaOHI8b0ys3QeIPjDh_y2w_ZQN_yWBZQY8IxUT12bRaLJ_ccU0KH2mCAlixOkvMPAkYPNb5qdw_sx4gmJUoVMQVjqLH1AWGskuto7uSc4mczjG1PWcwbSUZoF0tJOidf-p8_4zPmZqL2bW4dJvgGzZW40adeMXxDCadA3z9nBlLjjcHkfrqe7zL_xvSuInjHxBFd8zIhzNWTnDPbXzaw-czslNmqrZ7hbrFeLcu1UpvVrNttF-VyU6PCdSP1tm4U1mW9MHrdLLeoSz2jnSzkqtgUm8V6UcrVvG5WZVNs9bpcNLVaolgW2Guy83QRmPtwnOW__N1iJdelmlldo-V8E5Ey8SjkXX5kupmEXb4-1MORxbKwxJFf40SKFne_svHCuUMHowlMNXTTobMh2N0_vmBldjldsUaCn3fy7wAAAP__QZsxuA">