mirror of
https://github.com/frida/tinycc
synced 2024-11-28 10:33:07 +03:00
Support linker options passed in several -Wl param
ld support arguments to multiple-letter options being passed in two ways: * -opt=arg * -opt arg libtool generate command line of the second form. This commit add support for the second form so that libtool works with tcc. The way it is done is to concatenate all -Wl options into one and then pass it to set_linker.
This commit is contained in:
parent
1736a71b71
commit
7fb0482a46
3
libtcc.c
3
libtcc.c
@ -1566,6 +1566,9 @@ PUB_FUNC const char * tcc_set_linker(TCCState *s, char *option, int multi)
|
|||||||
s->text_addr = strtoull(p, &end, 16);
|
s->text_addr = strtoull(p, &end, 16);
|
||||||
s->has_text_addr = 1;
|
s->has_text_addr = 1;
|
||||||
} else {
|
} else {
|
||||||
|
char *comma_ptr = strchr(option, ',');
|
||||||
|
if (comma_ptr)
|
||||||
|
*comma_ptr = '\0';
|
||||||
return option;
|
return option;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
18
tcc.c
18
tcc.c
@ -280,6 +280,8 @@ static int parse_args(TCCState *s, int argc, char **argv)
|
|||||||
const char *optarg, *p1, *r1;
|
const char *optarg, *p1, *r1;
|
||||||
char *r;
|
char *r;
|
||||||
int was_pthread;
|
int was_pthread;
|
||||||
|
char *linker_arg = NULL;
|
||||||
|
unsigned long linker_argsize = 0;
|
||||||
|
|
||||||
was_pthread = 0; /* is set if commandline contains -pthread key */
|
was_pthread = 0; /* is set if commandline contains -pthread key */
|
||||||
|
|
||||||
@ -442,8 +444,17 @@ static int parse_args(TCCState *s, int argc, char **argv)
|
|||||||
s->rdynamic = 1;
|
s->rdynamic = 1;
|
||||||
break;
|
break;
|
||||||
case TCC_OPTION_Wl:
|
case TCC_OPTION_Wl:
|
||||||
if ((r = (char *) tcc_set_linker(s, (char *)optarg, TRUE)))
|
if (!linker_arg) {
|
||||||
tcc_error("unsupported linker option '%s'", r);
|
linker_argsize = strlen(optarg) + 1;
|
||||||
|
linker_arg = tcc_malloc(linker_argsize);
|
||||||
|
pstrcpy(linker_arg, linker_argsize, optarg);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
linker_argsize += strlen(optarg) + 1;
|
||||||
|
linker_arg = tcc_realloc(linker_arg, linker_argsize);
|
||||||
|
pstrcat(linker_arg, linker_argsize, ",");
|
||||||
|
pstrcat(linker_arg, linker_argsize, optarg);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case TCC_OPTION_E:
|
case TCC_OPTION_E:
|
||||||
output_type = TCC_OUTPUT_PREPROCESS;
|
output_type = TCC_OUTPUT_PREPROCESS;
|
||||||
@ -465,6 +476,9 @@ static int parse_args(TCCState *s, int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ((r = (char *) tcc_set_linker(s, (char *)linker_arg, TRUE)))
|
||||||
|
tcc_error("unsupported linker option '%s'", r);
|
||||||
|
tcc_free(linker_arg);
|
||||||
/* fixme: these options could be different on your platform */
|
/* fixme: these options could be different on your platform */
|
||||||
if (was_pthread && output_type != TCC_OUTPUT_OBJ) {
|
if (was_pthread && output_type != TCC_OUTPUT_OBJ) {
|
||||||
dynarray_add((void ***)&files, &nb_files, "-lpthread");
|
dynarray_add((void ***)&files, &nb_files, "-lpthread");
|
||||||
|
Loading…
Reference in New Issue
Block a user