portable gcc version check
preprocessor evaluates both, separate them
sometimes UL is ambiguous when selecting from overloaded functions
fdatasync must be implemented through fcntl
if we use lockguard, include boost locks
some systems dont have MAP_POPULATE
allow compiler  to decide which namespace these come from.

this prevents such errors as "error: 'je_free' is not a member of 'std'"
when jemalloc replaces these built-in functions.
properly implement malloc header emulation to avoid link issues.