Add -static option

This commit is contained in:
Rui Ueyama 2020-10-09 15:06:35 +09:00
parent f10bcebaa5
commit 1e9b6dd110
3 changed files with 35 additions and 10 deletions

View File

@ -113,7 +113,6 @@ Token *tokenize_file(char *filename);
// //
char *search_include_paths(char *filename); char *search_include_paths(char *filename);
bool file_exists(char *path);
void init_macros(void); void init_macros(void);
void define_macro(char *name, char *buf); void define_macro(char *name, char *buf);
void undef_macro(char *name); void undef_macro(char *name);

26
main.c
View File

@ -19,6 +19,7 @@ static bool opt_S;
static bool opt_c; static bool opt_c;
static bool opt_cc1; static bool opt_cc1;
static bool opt_hash_hash_hash; static bool opt_hash_hash_hash;
static bool opt_static;
static char *opt_MF; static char *opt_MF;
static char *opt_MT; static char *opt_MT;
static char *opt_o; static char *opt_o;
@ -277,6 +278,12 @@ static void parse_args(int argc, char **argv) {
continue; continue;
} }
if (!strcmp(argv[i], "-static")) {
opt_static = true;
strarray_push(&ld_extra_args, "-static");
continue;
}
if (!strcmp(argv[i], "-hashmap-test")) { if (!strcmp(argv[i], "-hashmap-test")) {
hashmap_test(); hashmap_test();
exit(0); exit(0);
@ -587,8 +594,6 @@ static void run_linker(StringArray *inputs, char *output) {
strarray_push(&arr, output); strarray_push(&arr, output);
strarray_push(&arr, "-m"); strarray_push(&arr, "-m");
strarray_push(&arr, "elf_x86_64"); strarray_push(&arr, "elf_x86_64");
strarray_push(&arr, "-dynamic-linker");
strarray_push(&arr, "/lib64/ld-linux-x86-64.so.2");
char *libpath = find_libpath(); char *libpath = find_libpath();
char *gcc_libpath = find_gcc_libpath(); char *gcc_libpath = find_gcc_libpath();
@ -597,8 +602,7 @@ static void run_linker(StringArray *inputs, char *output) {
strarray_push(&arr, format("%s/crti.o", libpath)); strarray_push(&arr, format("%s/crti.o", libpath));
strarray_push(&arr, format("%s/crtbegin.o", gcc_libpath)); strarray_push(&arr, format("%s/crtbegin.o", gcc_libpath));
strarray_push(&arr, format("-L%s", gcc_libpath)); strarray_push(&arr, format("-L%s", gcc_libpath));
strarray_push(&arr, format("-L%s", libpath)); strarray_push(&arr, "-L/usr/lib/x86_64-linux-gnu");
strarray_push(&arr, format("-L%s/..", libpath));
strarray_push(&arr, "-L/usr/lib64"); strarray_push(&arr, "-L/usr/lib64");
strarray_push(&arr, "-L/lib64"); strarray_push(&arr, "-L/lib64");
strarray_push(&arr, "-L/usr/lib/x86_64-linux-gnu"); strarray_push(&arr, "-L/usr/lib/x86_64-linux-gnu");
@ -607,17 +611,31 @@ static void run_linker(StringArray *inputs, char *output) {
strarray_push(&arr, "-L/usr/lib"); strarray_push(&arr, "-L/usr/lib");
strarray_push(&arr, "-L/lib"); strarray_push(&arr, "-L/lib");
if (!opt_static) {
strarray_push(&arr, "-dynamic-linker");
strarray_push(&arr, "/lib64/ld-linux-x86-64.so.2");
}
for (int i = 0; i < ld_extra_args.len; i++) for (int i = 0; i < ld_extra_args.len; i++)
strarray_push(&arr, ld_extra_args.data[i]); strarray_push(&arr, ld_extra_args.data[i]);
for (int i = 0; i < inputs->len; i++) for (int i = 0; i < inputs->len; i++)
strarray_push(&arr, inputs->data[i]); strarray_push(&arr, inputs->data[i]);
if (opt_static) {
strarray_push(&arr, "--start-group");
strarray_push(&arr, "-lgcc");
strarray_push(&arr, "-lgcc_eh");
strarray_push(&arr, "-lc");
strarray_push(&arr, "--end-group");
} else {
strarray_push(&arr, "-lc"); strarray_push(&arr, "-lc");
strarray_push(&arr, "-lgcc"); strarray_push(&arr, "-lgcc");
strarray_push(&arr, "--as-needed"); strarray_push(&arr, "--as-needed");
strarray_push(&arr, "-lgcc_s"); strarray_push(&arr, "-lgcc_s");
strarray_push(&arr, "--no-as-needed"); strarray_push(&arr, "--no-as-needed");
}
strarray_push(&arr, format("%s/crtend.o", gcc_libpath)); strarray_push(&arr, format("%s/crtend.o", gcc_libpath));
strarray_push(&arr, format("%s/crtn.o", libpath)); strarray_push(&arr, format("%s/crtn.o", libpath));
strarray_push(&arr, NULL); strarray_push(&arr, NULL);

View File

@ -274,4 +274,12 @@ echo 'foo' > $tmp/next3/file2.h
$chibicc -I$tmp/next1 -I$tmp/next2 -I$tmp/next3 -E $tmp/file.c | grep -q foo $chibicc -I$tmp/next1 -I$tmp/next2 -I$tmp/next3 -E $tmp/file.c | grep -q foo
check '#include_next' check '#include_next'
# -static
echo 'extern int bar; int foo() { return bar; }' > $tmp/foo.c
echo 'int foo(); int bar=3; int main() { foo(); }' > $tmp/bar.c
$chibicc -static -o $tmp/foo $tmp/foo.c $tmp/bar.c
check -static
file $tmp/foo | grep -q 'statically linked'
check -static
echo OK echo OK