( ) -Xlinker -zmuldefs.
, , , , , , .
, , , .c.
, , -zmuldefs , , , , .
-Dxxx , , ( , -zmuldefs , , , - , ).
, , . main() , , , , .
, -zmuldefs, , , .
, 2 , x1.c x2.c,
x1.c:
#include <stdio.h>
#include "x2.h"
int x();
int main() {
x();
}
int x() {
static int isRecursiveCall_ = 0;
printf("Hello, World 1!\r\n");
if (!isRecursiveCall_) {
isRecursiveCall_ = 1;
main();
x3();
isRecursiveCall_ = 0;
}
return 0;
}
x2.c:
#include <stdio.h>
#include "x2.h"
int main() {
printf("Hello, World 2!\r\n");
x3();
return 0;
}
int x3() {
printf("Hello, World 3!\r\n");
return 0;
}
x2.h
#ifndef LINKTEST_X_H
#define LINKTEST_X_H
int main2();
int x2();
int x3();
#endif
clang x2.c -Xlinker -zmuldefs -o test.o ./test.o :
Hello, World 2!
Hello, Wolrd 3!
clang x1.c x2.c -Xlinker -zmuldefs -o prog.o ./prog.o, :
Hello, World 1!
Hello, World 1!
Hello, World 3!
.
, - , -Dxxx, .
-Dxxx . , x2.c :
#include <stdio.h>
#include "x2.h"
#ifdef _UNIT_TEST_ENABLED
int main() {
printf("Hello, World 2!\r\n");
x3();
return 0;
}
#endif
int x3() {
printf("Hello, World 3!\r\n");
return 0;
}
, x2.c, clang x2.c -DUNIT_TEST_ENABLED -o test.o, clang x1.c x2.c -o prog.o.
, script, . . , , .
, #define , , . , , , .