| ... | ... | @@ -270,7 +270,7 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void { |
| 270 | 270 | "-g", |
| 271 | 271 | "-Wa,--noexecstack", |
| 272 | 272 | }); |
| 273 | | return build_crt_file(comp, "crti.o", &[1]Compilation.CSourceFile{ |
| 273 | return build_crt_file(comp, "crti.o", .Obj, &[1]Compilation.CSourceFile{ |
| 274 | 274 | .{ |
| 275 | 275 | .src_path = try start_asm_path(comp, arena, "crti.S"), |
| 276 | 276 | .extra_flags = args.items, |
| ... | ... | @@ -288,7 +288,7 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void { |
| 288 | 288 | "-g", |
| 289 | 289 | "-Wa,--noexecstack", |
| 290 | 290 | }); |
| 291 | | return build_crt_file(comp, "crtn.o", &[1]Compilation.CSourceFile{ |
| 291 | return build_crt_file(comp, "crtn.o", .Obj, &[1]Compilation.CSourceFile{ |
| 292 | 292 | .{ |
| 293 | 293 | .src_path = try start_asm_path(comp, arena, "crtn.S"), |
| 294 | 294 | .extra_flags = args.items, |
| ... | ... | @@ -339,10 +339,97 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void { |
| 339 | 339 | .extra_flags = args.items, |
| 340 | 340 | }; |
| 341 | 341 | }; |
| 342 | | return build_crt_file(comp, "Scrt1.o", &[_]Compilation.CSourceFile{ start_os, abi_note_o }); |
| 342 | return build_crt_file(comp, "Scrt1.o", .Obj, &[_]Compilation.CSourceFile{ start_os, abi_note_o }); |
| 343 | 343 | }, |
| 344 | 344 | .libc_nonshared_a => { |
| 345 | | return error.Unimplemented; // TODO |
| 345 | const deps = [_][]const u8{ |
| 346 | lib_libc_glibc ++ "stdlib" ++ path.sep_str ++ "atexit.c", |
| 347 | lib_libc_glibc ++ "stdlib" ++ path.sep_str ++ "at_quick_exit.c", |
| 348 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "stat.c", |
| 349 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "fstat.c", |
| 350 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "lstat.c", |
| 351 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "stat64.c", |
| 352 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "fstat64.c", |
| 353 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "lstat64.c", |
| 354 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "fstatat.c", |
| 355 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "fstatat64.c", |
| 356 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "mknod.c", |
| 357 | lib_libc_glibc ++ "io" ++ path.sep_str ++ "mknodat.c", |
| 358 | lib_libc_glibc ++ "nptl" ++ path.sep_str ++ "pthread_atfork.c", |
| 359 | lib_libc_glibc ++ "debug" ++ path.sep_str ++ "stack_chk_fail_local.c", |
| 360 | }; |
| 361 | |
| 362 | var c_source_files: [deps.len + 1]Compilation.CSourceFile = undefined; |
| 363 | |
| 364 | c_source_files[0] = blk: { |
| 365 | var args = std.ArrayList([]const u8).init(arena); |
| 366 | try args.appendSlice(&[_][]const u8{ |
| 367 | "-std=gnu11", |
| 368 | "-fgnu89-inline", |
| 369 | "-g", |
| 370 | "-O2", |
| 371 | "-fmerge-all-constants", |
| 372 | "-fno-stack-protector", |
| 373 | "-fmath-errno", |
| 374 | "-fno-stack-protector", |
| 375 | "-I", |
| 376 | try lib_path(comp, arena, lib_libc_glibc ++ "csu"), |
| 377 | }); |
| 378 | try add_include_dirs(comp, arena, &args); |
| 379 | try args.appendSlice(&[_][]const u8{ |
| 380 | "-DSTACK_PROTECTOR_LEVEL=0", |
| 381 | "-fPIC", |
| 382 | "-fno-stack-protector", |
| 383 | "-ftls-model=initial-exec", |
| 384 | "-D_LIBC_REENTRANT", |
| 385 | "-include", |
| 386 | try lib_path(comp, arena, lib_libc_glibc ++ "include" ++ path.sep_str ++ "libc-modules.h"), |
| 387 | "-DMODULE_NAME=libc", |
| 388 | "-Wno-nonportable-include-path", |
| 389 | "-include", |
| 390 | try lib_path(comp, arena, lib_libc_glibc ++ "include" ++ path.sep_str ++ "libc-symbols.h"), |
| 391 | "-DPIC", |
| 392 | "-DLIBC_NONSHARED=1", |
| 393 | "-DTOP_NAMESPACE=glibc", |
| 394 | }); |
| 395 | break :blk .{ |
| 396 | .src_path = try lib_path(comp, arena, lib_libc_glibc ++ "csu" ++ path.sep_str ++ "elf-init.c"), |
| 397 | .extra_flags = args.items, |
| 398 | }; |
| 399 | }; |
| 400 | |
| 401 | for (deps) |dep, i| { |
| 402 | var args = std.ArrayList([]const u8).init(arena); |
| 403 | try args.appendSlice(&[_][]const u8{ |
| 404 | "-std=gnu11", |
| 405 | "-fgnu89-inline", |
| 406 | "-g", |
| 407 | "-O2", |
| 408 | "-fmerge-all-constants", |
| 409 | "-fno-stack-protector", |
| 410 | "-fmath-errno", |
| 411 | "-ftls-model=initial-exec", |
| 412 | "-Wno-ignored-attributes", |
| 413 | }); |
| 414 | try add_include_dirs(comp, arena, &args); |
| 415 | try args.appendSlice(&[_][]const u8{ |
| 416 | "-D_LIBC_REENTRANT", |
| 417 | "-include", |
| 418 | try lib_path(comp, arena, lib_libc_glibc ++ "include" ++ path.sep_str ++ "libc-modules.h"), |
| 419 | "-DMODULE_NAME=libc", |
| 420 | "-Wno-nonportable-include-path", |
| 421 | "-include", |
| 422 | try lib_path(comp, arena, lib_libc_glibc ++ "include" ++ path.sep_str ++ "libc-symbols.h"), |
| 423 | "-DPIC", |
| 424 | "-DLIBC_NONSHARED=1", |
| 425 | "-DTOP_NAMESPACE=glibc", |
| 426 | }); |
| 427 | c_source_files[i + 1] = .{ |
| 428 | .src_path = try lib_path(comp, arena, dep), |
| 429 | .extra_flags = args.items, |
| 430 | }; |
| 431 | } |
| 432 | return build_crt_file(comp, "libc_nonshared.a", .Lib, &c_source_files); |
| 346 | 433 | }, |
| 347 | 434 | } |
| 348 | 435 | } |
| ... | ... | @@ -588,6 +675,7 @@ fn lib_path(comp: *Compilation, arena: *Allocator, sub_path: []const u8) ![]cons |
| 588 | 675 | fn build_crt_file( |
| 589 | 676 | comp: *Compilation, |
| 590 | 677 | basename: []const u8, |
| 678 | output_mode: std.builtin.OutputMode, |
| 591 | 679 | c_source_files: []const Compilation.CSourceFile, |
| 592 | 680 | ) !void { |
| 593 | 681 | const tracy = trace(@src()); |
| ... | ... | @@ -605,7 +693,7 @@ fn build_crt_file( |
| 605 | 693 | .target = comp.getTarget(), |
| 606 | 694 | .root_name = mem.split(basename, ".").next().?, |
| 607 | 695 | .root_pkg = null, |
| 608 | | .output_mode = .Obj, |
| 696 | .output_mode = output_mode, |
| 609 | 697 | .rand = comp.rand, |
| 610 | 698 | .libc_installation = comp.bin_file.options.libc_installation, |
| 611 | 699 | .emit_bin = emit_bin, |