mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
- Fix problem where crt1 was linked for dynamic libraries on Linux and BSD. #1710
This commit is contained in:
committed by
Christoffer Lerno
parent
e453e6f9ca
commit
0ff52311c3
8
.github/workflows/main.yml
vendored
8
.github/workflows/main.yml
vendored
@@ -66,8 +66,8 @@ jobs:
|
||||
- name: Compile and run dynlib-test
|
||||
run: |
|
||||
cd resources/examples/dynlib-test
|
||||
..\..\..\build\${{ matrix.build_type }}\c3c.exe dynamic-lib add.c3
|
||||
..\..\..\build\${{ matrix.build_type }}\c3c.exe compile-run test.c3 -l ./add.lib
|
||||
..\..\..\build\${{ matrix.build_type }}\c3c.exe -vv dynamic-lib add.c3
|
||||
..\..\..\build\${{ matrix.build_type }}\c3c.exe -vv compile-run test.c3 -l ./add.lib
|
||||
|
||||
- name: Vendor-fetch
|
||||
run: |
|
||||
@@ -320,7 +320,7 @@ jobs:
|
||||
- name: Compile and run dynlib-test
|
||||
run: |
|
||||
cd resources/examples/dynlib-test
|
||||
../../../build/c3c dynamic-lib add.c3
|
||||
../../../build/c3c -vv dynamic-lib add.c3
|
||||
mv add.so libadd.so
|
||||
cc test.c -L. -ladd -Wl,-rpath=.
|
||||
./a.out
|
||||
@@ -639,7 +639,7 @@ jobs:
|
||||
- name: Compile and run dynlib-test
|
||||
run: |
|
||||
cd resources/examples/dynlib-test
|
||||
../../../build/c3c dynamic-lib add.c3
|
||||
../../../build/c3c -vv dynamic-lib add.c3
|
||||
../../../build/c3c compile-run test.c3 -l ./add.dylib
|
||||
|
||||
- name: Compile run unit tests
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
- Fix bug when a macro calling an extern function was called in another module also declaring and calling the same function. #1690
|
||||
- `static-lib` and `dynamic-lib` options from the command line now produces headers.
|
||||
- Fix bug outputting exported functions without predefined extname.
|
||||
- Fix problem where crt1 was linked for dynamic libraries on Linux and BSD. #1710
|
||||
|
||||
### Stdlib changes
|
||||
- Increase BitWriter.write_bits limit up to 32 bits.
|
||||
|
||||
@@ -12,11 +12,11 @@ const char *quote_arg = "\"";
|
||||
const char *concat_arg = ":";
|
||||
const char *concat_quote_arg = "+";
|
||||
const char *concat_file_arg = "/";
|
||||
#define add_quote_arg(arg_) vec_add(*args_ref, quote_arg); vec_add(*args_ref, (arg_))
|
||||
#define add_quote_arg(arg_) do { vec_add(*args_ref, quote_arg); vec_add(*args_ref, (arg_)); } while(0)
|
||||
#define add_plain_arg(arg_) vec_add(*args_ref, (arg_))
|
||||
#define add_concat_file_arg(arg_, arg2_) vec_add(*args_ref, concat_file_arg); vec_add(*args_ref, (arg_)); vec_add(*args_ref, (arg2_))
|
||||
#define add_concat_arg(arg_, arg2_) vec_add(*args_ref, concat_arg); vec_add(*args_ref, (arg_)); vec_add(*args_ref, (arg2_))
|
||||
#define add_concat_quote_arg(arg_, arg2_) vec_add(*args_ref, concat_quote_arg); vec_add(*args_ref, (arg_)); vec_add(*args_ref, (arg2_))
|
||||
#define add_concat_file_arg(arg_, arg2_) do { vec_add(*args_ref, concat_file_arg); vec_add(*args_ref, (arg_)); vec_add(*args_ref, (arg2_)); } while(0)
|
||||
#define add_concat_arg(arg_, arg2_) do { vec_add(*args_ref, concat_arg); vec_add(*args_ref, (arg_)); vec_add(*args_ref, (arg2_)); } while(0)
|
||||
#define add_concat_quote_arg(arg_, arg2_) do { vec_add(*args_ref, concat_quote_arg); vec_add(*args_ref, (arg_)); vec_add(*args_ref, (arg2_)); } while(0)
|
||||
|
||||
static char *assemble_linker_command(const char **args, bool extra_quote);
|
||||
static unsigned assemble_link_arguments(const char **arguments, unsigned len);
|
||||
@@ -331,7 +331,7 @@ static const char *find_linux_crt_begin(void)
|
||||
return path;
|
||||
}
|
||||
|
||||
static void linker_setup_linux(const char ***args_ref, Linker linker_type)
|
||||
static void linker_setup_linux(const char ***args_ref, Linker linker_type, bool is_dylib)
|
||||
{
|
||||
linking_add_link(&compiler.linking, "dl");
|
||||
if (linker_type == LINKER_CC)
|
||||
@@ -374,16 +374,16 @@ static void linker_setup_linux(const char ***args_ref, Linker linker_type)
|
||||
}
|
||||
if (is_pie_pic(compiler.platform.reloc_model))
|
||||
{
|
||||
add_concat_file_arg(crt_dir, "Scrt1.o");
|
||||
add_concat_file_arg(crt_begin_dir, "crtbeginS.o");
|
||||
add_concat_file_arg(crt_dir, "crti.o");
|
||||
if (!is_dylib) add_concat_file_arg(crt_dir, "Scrt1.o");
|
||||
add_concat_file_arg(crt_begin_dir, "crtbeginS.o");
|
||||
add_concat_file_arg(crt_begin_dir, "crtendS.o");
|
||||
}
|
||||
else
|
||||
{
|
||||
add_concat_file_arg(crt_dir, "crt1.o");
|
||||
add_concat_file_arg(crt_begin_dir, "crtbegin.o");
|
||||
add_concat_file_arg(crt_dir, "crti.o");
|
||||
if (!is_dylib) add_concat_file_arg(crt_dir, "crt1.o");
|
||||
add_concat_file_arg(crt_begin_dir, "crtbegin.o");
|
||||
add_concat_file_arg(crt_begin_dir, "crtend.o");
|
||||
}
|
||||
add_concat_file_arg(crt_dir, "crtn.o");
|
||||
@@ -399,7 +399,7 @@ static void linker_setup_linux(const char ***args_ref, Linker linker_type)
|
||||
add_plain_arg(ld_target(compiler.platform.arch));
|
||||
}
|
||||
|
||||
static void linker_setup_freebsd(const char ***args_ref, Linker linker_type)
|
||||
static void linker_setup_freebsd(const char ***args_ref, Linker linker_type, bool is_dylib)
|
||||
{
|
||||
if (linker_type == LINKER_CC) {
|
||||
linking_add_link(&compiler.linking, "m");
|
||||
@@ -421,20 +421,19 @@ static void linker_setup_freebsd(const char ***args_ref, Linker linker_type)
|
||||
{
|
||||
add_plain_arg("--gc-sections");
|
||||
}
|
||||
|
||||
if (is_pie_pic(compiler.platform.reloc_model))
|
||||
{
|
||||
add_plain_arg("-pie");
|
||||
add_concat_file_arg(crt_dir, "Scrt1.o");
|
||||
add_concat_file_arg(crt_dir, "crtbeginS.o");
|
||||
add_concat_file_arg(crt_dir, "crti.o");
|
||||
if (!is_dylib) add_concat_file_arg(crt_dir, "Scrt1.o");
|
||||
add_concat_file_arg(crt_dir, "crtbeginS.o");
|
||||
add_concat_file_arg(crt_dir, "crtendS.o");
|
||||
}
|
||||
else
|
||||
{
|
||||
add_concat_file_arg(crt_dir, "crt1.o");
|
||||
add_concat_file_arg(crt_dir, "crtbegin.o");
|
||||
add_concat_file_arg(crt_dir, "crti.o");
|
||||
if (!is_dylib) add_concat_file_arg(crt_dir, "crt1.o");
|
||||
add_concat_file_arg(crt_dir, "crtbegin.o");
|
||||
add_concat_file_arg(crt_dir, "crtend.o");
|
||||
}
|
||||
add_concat_file_arg(crt_dir, "crtn.o");
|
||||
@@ -546,10 +545,10 @@ static bool linker_setup(const char ***args_ref, const char **files_to_link, uns
|
||||
case OS_TYPE_FREE_BSD:
|
||||
case OS_TYPE_OPENBSD:
|
||||
case OS_TYPE_NETBSD:
|
||||
linker_setup_freebsd(args_ref, linker_type);
|
||||
linker_setup_freebsd(args_ref, linker_type, is_dylib);
|
||||
break;
|
||||
case OS_TYPE_LINUX:
|
||||
linker_setup_linux(args_ref, linker_type);
|
||||
linker_setup_linux(args_ref, linker_type, is_dylib);
|
||||
break;
|
||||
case OS_TYPE_UNKNOWN:
|
||||
if (link_libc())
|
||||
|
||||
Reference in New Issue
Block a user