Implementation:ClickHouse ClickHouse Glibc Compatibility
| Knowledge Sources | |
|---|---|
| Domains | Portability, System_Compatibility |
| Last Updated | 2026-02-08 00:00 GMT |
Overview
Compatibility layer providing glibc symbol replacements for building with newer glibc versions while maintaining runtime compatibility with older systems.
Description
This implementation provides wrapper functions and symbol replacements that allow ClickHouse to be built with glibc 2.27 while running on systems with glibc 2.4 or later. It includes fortified function variants, POSIX spawn functionality, system call wrappers, and compatibility functions for features not available in older glibc versions. The code replaces security-checking variants with simpler versions and implements missing system calls directly via syscall interface.
Usage
Use this compatibility layer when building binaries that need to run on a wide range of Linux distributions with different glibc versions, particularly when targeting older enterprise systems like CentOS 5 or Ubuntu Hardy.
Code Reference
Source Location
- Repository: ClickHouse
- File: base/glibc-compatibility/glibc-compatibility.c
- Lines: 1-432
Signature
// Fortified function replacements
int __fdelt_chk(long int d);
int __poll_chk(struct pollfd *fds, nfds_t nfds, int timeout, size_t fdslen);
void __longjmp_chk(jmp_buf env, int val);
int __vasprintf_chk(char **s, int unused, const char *fmt, va_list ap);
size_t __fread_chk(void *ptr, size_t unused, size_t size, size_t nmemb, void *stream);
void __explicit_bzero_chk(void *buf, size_t len, size_t unused);
// POSIX spawn file actions
int posix_spawn_file_actions_init(posix_spawn_file_actions_t *fa);
int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t *fa, const char *path);
int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *fa, int fd);
int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *fa, int srcfd, int fd);
// System call wrappers
ssize_t copy_file_range(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len, unsigned flags);
long splice(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len, unsigned flags);
int statx(int fd, const char *path, int flag, unsigned int mask, struct statx *statxbuf);
ssize_t getrandom(void *buf, size_t buflen, unsigned flags);
Import
// Linked automatically when building with glibc compatibility layer
// No explicit include needed - symbols provided at link time
I/O Contract
| Function Category | Input | Output | Side Effects |
|---|---|---|---|
| Fortified Functions | Original parameters plus buffer sizes | Same as standard versions | Aborts on overflow detection |
| POSIX Spawn | File actions structure, file descriptors | Error codes (0 or ENOMEM/EBADF) | Allocates action nodes |
| System Calls | File descriptors, buffers, flags | Bytes transferred or status codes | Direct kernel interaction |
| Thread Names | Thread handle, name buffer | Always returns 0 (no-op) | None (no-op implementation) |
Usage Examples
// Fortified string operations (automatically replaced)
char *str;
asprintf(&str, "Value: %d", 42); // Uses __asprintf_chk internally
// POSIX spawn with file actions
posix_spawn_file_actions_t actions;
posix_spawn_file_actions_init(&actions);
posix_spawn_file_actions_addchdir_np(&actions, "/tmp");
posix_spawn_file_actions_addclose(&actions, STDERR_FILENO);
pid_t pid;
char *argv[] = {"/bin/ls", "-l", NULL};
char *envp[] = {NULL};
posix_spawnp(&pid, "ls", &actions, NULL, argv, envp);
posix_spawn_file_actions_destroy(&actions);
// Zero-copy file operations
off_t off_in = 0, off_out = 0;
ssize_t copied = copy_file_range(fd_src, &off_in, fd_dst, &off_out, 4096, 0);
// Secure memory clearing
char password[256];
// ... use password ...
explicit_bzero(password, sizeof(password)); // Uses __explicit_bzero_chk