Skip to content

Commit

Permalink
glibc compat: add a test and README
Browse files Browse the repository at this point in the history
  • Loading branch information
motiejus committed Mar 28, 2023
1 parent 7e6aeea commit b692c8a
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 0 deletions.
9 changes: 9 additions & 0 deletions lib/libc/glibc/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
glibc sources are slightly patched for backwards compatibility. This is not
good, because it requires to maintain our patchset to glibc headers.

Until universal headers are real and this file can be removed, these commits
need to be cherry-picked in the future glibc header upgrades:

Commits:
- 39083c31a550ed80f369f60d35791e98904b8096
- a89813ef282c092a9caf699731c7faaf485acabe
4 changes: 4 additions & 0 deletions test/link.zig
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ pub const cases = [_]Case{
.build_root = "test/link/interdependent_static_c_libs",
.import = @import("link/interdependent_static_c_libs/build.zig"),
},
.{
.build_root = "test/link/glibc_compat",
.import = @import("link/glibc_compat/build.zig"),
},

// WASM Cases
.{
Expand Down
23 changes: 23 additions & 0 deletions test/link/glibc_compat/build.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const std = @import("std");

pub fn build(b: *std.Build) void {
const test_step = b.step("test", "Test");
b.default_step = test_step;

const targets: []const []const u8 = &.{
"aarch64-linux-gnu.2.27",
"aarch64-linux-gnu.2.34",
};

for (targets) |target| {
const exe = b.addExecutable(.{
.name = target,
.root_source_file = .{ .path = "main.c" },
.target = std.zig.CrossTarget.parse(
.{ .arch_os_abi = target },
) catch unreachable,
});
exe.linkLibC();
test_step.dependOn(&exe.step);
}
}
37 changes: 37 additions & 0 deletions test/link/glibc_compat/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#define _FILE_OFFSET_BITS 64
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <resolv.h>

int main() {
/* in glibc 2.28+ and _FILE_OFFSET_BITS=64 fcntl is #define'd to fcntl64
* Thus headers say `fcntl64` exists, but libc.so.6 (the old one)
* disagrees, resulting in a linking error unless headers are made
* backwards-compatible.
*
* Glibc 2.28+:
* FUNC GLOBAL DEFAULT UND fcntl64@GLIBC_2.28 (3):
*
* Glibc 2.27 or older:
* FUNC GLOBAL DEFAULT UND fcntl@GLIBC_2.2.5
*/
printf("address to fcntl: %p\n", fcntl);

/* The following functions became symbols of their own right with glibc
* 2.34+. Before 2.34 resolv.h would #define res_search __res_search; and
* __res_search is a valid symbol since the beginning of time.
*
* On glibc 2.34+ these symbols are linked this way:
* FUNC GLOBAL DEFAULT UND res_search@GLIBC_2.34 (2)
*
* Pre-glibc 2.34:
* FUNC GLOBAL DEFAULT UND __res_search@GLIBC_2.2.5 (4)
*/
printf("address to res_search: %p\n", res_search);
printf("address to res_nsearch: %p\n", res_nsearch);
printf("address to res_query: %p\n", res_query);
printf("address to res_nquery: %p\n", res_nquery);
printf("address to res_querydomain: %p\n", res_querydomain);
printf("address to res_nquerydomain: %p\n", res_nquerydomain);
}

0 comments on commit b692c8a

Please sign in to comment.