How does libc do printf for %lld for universal binaries? On Aug 11, 2010, at 11:38 AM, Jim Jagielski wrote:
> Universal binaries for OS X and APR are not supported. I must > force either 32 or 64 bit... Attempts to fix this at the > APR level have been vetoed and so no further effort can > be done. > > The long and short of it (no pun intended) is that under > OS X and universal binaries, you can no longer have > some type lengths statically defined in *.h files as > being a certain number of bits. Instead, the APR *.h files > would require some internal #if tests which "looks" to see > how the package is being compiled and then selects the > correct set of bit sizes... This was deemed "too ugly" > and was vetoed. > > For hints, I would encourage people to see how MacPorts > works around this... > > On Aug 11, 2010, at 12:02 PM, Hyrum K. Wright wrote: > >> Unfortunately, you seem to have found the same bug I uncovered in March: >> http://mail-archives.apache.org/mod_mbox/apr-dev/201003.mbox/%3cb51ffb6f1003100926n22c1dd79id9696972b23a1...@mail.gmail.com%3e >> >> To my knowledge it hasn't been fixed, thought that thread does include >> a somewhat hacky patch to work around the issue. Perhaps it will be >> of use to you. >> >> -Hyrum >> >> On Wed, Aug 11, 2010 at 10:51 AM, Chris Knight >> <christopher.d.kni...@nasa.gov> wrote: >>> I spent half-a-day yesterday trying to figure out why I was crashing in >>> apr_psprintf on a strlen until I realized that my "%llu%s" format string >>> was causing it to use my long long int as a char *. >>> >>> Needless to say, no harm in adding support for %ll[du] yes? >>> >>> Ah, 64-bit fun for everyone.... >>> >>> Example code: >>> >>> #include <apr.h> >>> #include <apr_pools.h> >>> #include <apr_strings.h> >>> #include <stdio.h> >>> >>> int main(int argc, char **argv) { >>> apr_pool_t *pool = NULL; >>> char *s = "hello world"; u_int64_t v = 12345678; >>> >>> apr_pool_initialize(); apr_pool_create(&(pool), NULL); >>> printf("%llu%s", v, s); // works >>> char *f = apr_psprintf(pool, "%llu%s", v, s); // segfault on strlen >>> printf("%s\n", f); >>> } >> >