diff --git a/ndk-pkg b/ndk-pkg index 488eebd..469d91a 100755 --- a/ndk-pkg +++ b/ndk-pkg @@ -8298,6 +8298,8 @@ int main(int argc, char * argv[]) { } EOF + ################################################################################## + cat > wrapper-target-cc.c < #include @@ -8311,6 +8313,72 @@ EOF #define ACTION_CREATE_DYNAMICALLY_LINKED_EXECUTABLE 4 int main(int argc, char * argv[]) { + char * const cc = getenv("ANDROID_NDK_CC"); + + if (cc == NULL) { + fprintf(stderr, "ANDROID_NDK_CC environment variable is not set.\n"); + return 1; + } + + if (cc[0] == '\0') { + fprintf(stderr, "ANDROID_NDK_CC environment variable value should be a non-empty string.\n"); + return 2; + } + + ///////////////////////////////////////////////////////////////// + + const char * const TARGET = getenv("ANDROID_TARGET"); + + if (TARGET == NULL) { + fprintf(stderr, "ANDROID_TARGET environment variable is not set.\n"); + return 3; + } + + if (TARGET[0] == '\0') { + fprintf(stderr, "ANDROID_TARGET environment variable value should be a non-empty string.\n"); + return 4; + } + + ///////////////////////////////////////////////////////////////// + + const char * const SYSROOT = getenv("ANDROID_NDK_SYSROOT"); + + if (SYSROOT == NULL) { + fprintf(stderr, "ANDROID_NDK_SYSROOT environment variable is not set.\n"); + return 5; + } + + if (SYSROOT[0] == '\0') { + fprintf(stderr, "ANDROID_NDK_SYSROOT environment variable value should be a non-empty string.\n"); + return 6; + } + + ///////////////////////////////////////////////////////////////// + + size_t targetArgLength = strlen(TARGET) + 10U; + char targetArg[targetArgLength]; + + int ret = snprintf(targetArg, targetArgLength, "--target=%s", TARGET); + + if (ret < 0) { + perror(NULL); + return 7; + } + + ///////////////////////////////////////////////////////////////// + + size_t sysrootArgLength = strlen(SYSROOT) + 11U; + char sysrootArg[sysrootArgLength]; + + ret = snprintf(sysrootArg, sysrootArgLength, "--sysroot=%s", SYSROOT); + + if (ret < 0) { + perror(NULL); + return 8; + } + + ///////////////////////////////////////////////////////////////// + const char * options[6] = { "-shared", "-static", "--static", "-pie", "-c", "-o" }; int indexes[6] = { -1, -1, -1, -1, -1, -1 }; @@ -8337,31 +8405,169 @@ int main(int argc, char * argv[]) { ///////////////////////////////////////////////////////////////// -#ifdef USED_AS_CXX - char * const compiler = getenv("ANDROID_NDK_CXX"); + char* argv2[argc + 5]; - if (compiler == NULL) { - fprintf(stderr, "ANDROID_NDK_CXX environment variable is not set.\n"); - return 1; + char sonameArg[100]; sonameArg[0] = '\0'; + + if (action == ACTION_CREATE_SHARED_LIBRARY) { + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "-static") == 0) { + argv2[i] = (char*)"-fPIC"; + } else if (strcmp(argv[i], "--static") == 0) { + argv2[i] = (char*)"-fPIC"; + } else if (strcmp(argv[i], "-pie") == 0) { + argv2[i] = (char*)"-fPIC"; + } else { + argv2[i] = argv[i]; + } + } + + char * outputFilePath = NULL; + char * outputFileName = NULL; + + if (indexes[5] == -1) { + // It's rare to see. like -o/a/b/libxx.so.1 + for (int i = 1; i < argc; i++) { + if (strncmp(argv[i], "-o", 2) == 0) { + indexes[5] = i; + outputFilePath = &argv[i][2]; + break; + } + } + } else { + // if -o option is specified. + int i = indexes[5] + 1; + + if (i < argc) { + outputFilePath = argv[i]; + } + } + + if (outputFilePath != NULL) { + int len = 0; + + for (;;) { + if (outputFilePath[len] == '\0') { + break; + } else { + len++; + } + } + + for (int i = len - 1; i > 0; i--) { + if (outputFilePath[i] == '/') { + outputFileName = outputFilePath + i + 1; + break; + } + } + + if (outputFileName == NULL) { + outputFileName = outputFilePath; + } + + regex_t regex; + + if (regcomp(®ex, "^lib.*\\\\.so", 0) != 0) { + perror(NULL); + regfree(®ex); + return 9; + } + + regmatch_t regmatch[2]; + + if (regexec(®ex, outputFileName, 2, regmatch, 0) == 0) { + //printf("regmatch[0].rm_so=%d\n", regmatch[0].rm_so); + //printf("regmatch[0].rm_eo=%d\n", regmatch[0].rm_eo); + + if ((regmatch[0].rm_so >= 0) && (regmatch[0].rm_eo > regmatch[0].rm_so)) { + int n = regmatch[0].rm_eo - regmatch[0].rm_so; + const char * str = &outputFileName[regmatch[0].rm_so]; + + ret = snprintf(sonameArg, n + 13, "-Wl,-soname,%s", str); + + if (ret < 0) { + perror(NULL); + regfree(®ex); + return 10; + } + } + } + + regfree(®ex); + } + } else if (action == ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE) { + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "-rdynamic") == 0) { + argv2[i] = (char*)"-static"; + } else if (strcmp(argv[i], "-Wl,--export-dynamic") == 0) { + argv2[i] = (char*)"-static"; + } else if (strcmp(argv[i], "-Wl,-Bdynamic") == 0) { + argv2[i] = (char*)"-static"; + } else if (strcmp(argv[i], "-pie") == 0) { + argv2[i] = (char*)"-static"; + } else { + argv2[i] = argv[i]; + } + } + } else { + for (int i = 1; i < argc; i++) { + argv2[i] = argv[i]; + } } - if (compiler[0] == '\0') { - fprintf(stderr, "ANDROID_NDK_CXX environment variable value should be a non-empty string.\n"); - return 2; + ///////////////////////////////////////////////////////////////// + + argv2[0] = cc; + argv2[argc] = targetArg; + argv2[argc + 1] = sysrootArg; + + if (action == ACTION_CREATE_SHARED_LIBRARY) { + argv2[argc + 2] = (char*)"-fPIC"; + + if (sonameArg[0] == '\0') { + argv2[argc + 3] = NULL; + } else { + argv2[argc + 3] = sonameArg; + argv2[argc + 4] = NULL; + } + } else { + argv2[argc + 2] = NULL; } -#else - char * const compiler = getenv("ANDROID_NDK_CC"); - if (compiler == NULL) { - fprintf(stderr, "ANDROID_NDK_CC environment variable is not set.\n"); + ///////////////////////////////////////////////////////////////// + + execv (cc, argv2); + perror(cc); + return 255; +} +EOF + + ################################################################################## + + cat > wrapper-target-c++.c < +#include +#include +#include +#include + +#define ACTION_COMPILE 1 +#define ACTION_CREATE_SHARED_LIBRARY 2 +#define ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE 3 +#define ACTION_CREATE_DYNAMICALLY_LINKED_EXECUTABLE 4 + +int main(int argc, char * argv[]) { + char * const cxxc = getenv("ANDROID_NDK_CXX"); + + if (cxxc == NULL) { + fprintf(stderr, "ANDROID_NDK_CXX environment variable is not set.\n"); return 1; } - if (compiler[0] == '\0') { - fprintf(stderr, "ANDROID_NDK_CC environment variable value should be a non-empty string.\n"); + if (cxxc[0] == '\0') { + fprintf(stderr, "ANDROID_NDK_CXX environment variable value should be a non-empty string.\n"); return 2; } -#endif ///////////////////////////////////////////////////////////////// @@ -8377,30 +8583,34 @@ int main(int argc, char * argv[]) { return 4; } - size_t targetArgLength = strlen(TARGET) + 10U; - char targetArg[targetArgLength]; - - int ret = snprintf(targetArg, targetArgLength, "--target=%s", TARGET); - - if (ret < 0) { - perror(NULL); - return 5; - } - ///////////////////////////////////////////////////////////////// const char * const SYSROOT = getenv("ANDROID_NDK_SYSROOT"); if (SYSROOT == NULL) { fprintf(stderr, "ANDROID_NDK_SYSROOT environment variable is not set.\n"); - return 6; + return 5; } if (SYSROOT[0] == '\0') { fprintf(stderr, "ANDROID_NDK_SYSROOT environment variable value should be a non-empty string.\n"); + return 6; + } + + ///////////////////////////////////////////////////////////////// + + size_t targetArgLength = strlen(TARGET) + 10U; + char targetArg[targetArgLength]; + + int ret = snprintf(targetArg, targetArgLength, "--target=%s", TARGET); + + if (ret < 0) { + perror(NULL); return 7; } + ///////////////////////////////////////////////////////////////// + size_t sysrootArgLength = strlen(SYSROOT) + 11U; char sysrootArg[sysrootArgLength]; @@ -8413,29 +8623,49 @@ int main(int argc, char * argv[]) { ///////////////////////////////////////////////////////////////// + const char * options[6] = { "-shared", "-static", "--static", "-pie", "-c", "-o" }; + int indexes[6] = { -1, -1, -1, -1, -1, -1 }; + + for (int i = 1; i < argc; i++) { + for (int j = 0; j < 6; j++) { + if (strcmp(argv[i], options[j]) == 0) { + indexes[j] = i; + break; + } + } + } + + int action = 0; + + if (indexes[0] > 0) { + // if -shared option is specified, then remove -static , --static , -pie options if they also are specified + action = ACTION_CREATE_SHARED_LIBRARY; + } else if ((indexes[1] > 0) || (indexes[2] > 0)) { + // if -shared option is not specified, but -static or --static option is specified, then remove -pie , -Wl,-Bdynamic option if it also is specified + action = ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE; + } else if (indexes[3] > 0) { + action = ACTION_CREATE_DYNAMICALLY_LINKED_EXECUTABLE; + } + + ///////////////////////////////////////////////////////////////// + char* argv2[argc + 5]; - argv2[0] = compiler; - argv2[1] = targetArg; - argv2[2] = sysrootArg; + char sonameArg[100]; sonameArg[0] = '\0'; if (action == ACTION_CREATE_SHARED_LIBRARY) { - argv2[3] = (char*)"-fPIC"; - for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-static") == 0) { - argv2[i + 3] = (char*)"-fPIC"; + argv2[i] = (char*)"-fPIC"; } else if (strcmp(argv[i], "--static") == 0) { - argv2[i + 3] = (char*)"-fPIC"; + argv2[i] = (char*)"-fPIC"; } else if (strcmp(argv[i], "-pie") == 0) { - argv2[i + 3] = (char*)"-fPIC"; + argv2[i] = (char*)"-fPIC"; } else { - argv2[i + 3] = argv[i]; + argv2[i] = argv[i]; } } - char sonameArg[100]; sonameArg[0] = '\0'; - char * outputFilePath = NULL; char * outputFileName = NULL; @@ -8509,51 +8739,61 @@ int main(int argc, char * argv[]) { regfree(®ex); } - - if (sonameArg[0] == '\0') { - argv2[argc + 3] = NULL; - } else { - argv2[argc + 3] = sonameArg; - argv2[argc + 4] = NULL; - } } else if (action == ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE) { for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-rdynamic") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else if (strcmp(argv[i], "-Wl,--export-dynamic") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else if (strcmp(argv[i], "-Wl,-Bdynamic") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else if (strcmp(argv[i], "-pie") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else { - argv2[i + 2] = argv[i]; + argv2[i] = argv[i]; } } - - argv2[argc + 2] = NULL; } else { for (int i = 1; i < argc; i++) { - argv2[i + 2] = argv[i]; + argv2[i] = argv[i]; } + } + + ///////////////////////////////////////////////////////////////// + + argv2[0] = cxxc; + argv2[argc] = targetArg; + argv2[argc + 1] = sysrootArg; + if (action == ACTION_CREATE_SHARED_LIBRARY) { + argv2[argc + 2] = (char*)"-fPIC"; + + if (sonameArg[0] == '\0') { + argv2[argc + 3] = NULL; + } else { + argv2[argc + 3] = sonameArg; + argv2[argc + 4] = NULL; + } + } else { argv2[argc + 2] = NULL; } - execv (compiler, argv2); - perror(compiler); + ///////////////////////////////////////////////////////////////// + + execv (cxxc, argv2); + perror(cxxc); return 255; } EOF ################################################################################## - run cc -std=c99 -o wrapper-native-cc wrapper-native-cc.c - run cc -std=c99 -o wrapper-native-c++ wrapper-native-c++.c - run cc -std=c99 -o wrapper-native-objc wrapper-native-objc.c + run cc -std=c99 -Os -o wrapper-native-cc wrapper-native-cc.c + run cc -std=c99 -Os -o wrapper-native-c++ wrapper-native-c++.c + run cc -std=c99 -Os -o wrapper-native-objc wrapper-native-objc.c - run cc -std=c99 -o wrapper-target-cc wrapper-target-cc.c -UUSED_AS_CXX - run cc -std=c99 -o wrapper-target-c++ wrapper-target-cc.c -DUSED_AS_CXX + run cc -std=c99 -Os -o wrapper-target-cc wrapper-target-cc.c + run cc -std=c99 -Os -o wrapper-target-c++ wrapper-target-c++.c ######################################################################################### @@ -8996,7 +9236,7 @@ main() { NDKPKG="$CURRENT_SCRIPT_FILEPATH" - NDKPKG_VERSION=0.7.5 + NDKPKG_VERSION=0.7.6 NDKPKG_ZSH_COMPLETION_SCRIPT_URL='https://raw.githubusercontent.com/leleliu008/ndk-pkg/master/ndk-pkg-zsh-completion' NDKPKG_OFFICIAL_FORMULA_REPO_URL='https://github.com/leleliu008/ndk-pkg-formula-repository-official-core.git' diff --git a/wrapper-target-c++.c b/wrapper-target-c++.c index 4ef6775..fa5d976 100644 --- a/wrapper-target-c++.c +++ b/wrapper-target-c++.c @@ -10,32 +10,6 @@ #define ACTION_CREATE_DYNAMICALLY_LINKED_EXECUTABLE 4 int main(int argc, char * argv[]) { - const char * options[6] = { "-shared", "-static", "--static", "-pie", "-c", "-o" }; - int indexes[6] = { -1, -1, -1, -1, -1, -1 }; - - for (int i = 1; i < argc; i++) { - for (int j = 0; j < 6; j++) { - if (strcmp(argv[i], options[j]) == 0) { - indexes[j] = i; - break; - } - } - } - - int action = 0; - - if (indexes[0] > 0) { - // if -shared option is specified, then remove -static , --static , -pie options if they also are specified - action = ACTION_CREATE_SHARED_LIBRARY; - } else if ((indexes[1] > 0) || (indexes[2] > 0)) { - // if -shared option is not specified, but -static or --static option is specified, then remove -pie , -Wl,-Bdynamic option if it also is specified - action = ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE; - } else if (indexes[3] > 0) { - action = ACTION_CREATE_DYNAMICALLY_LINKED_EXECUTABLE; - } - - ///////////////////////////////////////////////////////////////// - char * const cxxc = getenv("ANDROID_NDK_CXX"); if (cxxc == NULL) { @@ -62,30 +36,34 @@ int main(int argc, char * argv[]) { return 4; } - size_t targetArgLength = strlen(TARGET) + 10U; - char targetArg[targetArgLength]; - - int ret = snprintf(targetArg, targetArgLength, "--target=%s", TARGET); - - if (ret < 0) { - perror(NULL); - return 5; - } - ///////////////////////////////////////////////////////////////// const char * const SYSROOT = getenv("ANDROID_NDK_SYSROOT"); if (SYSROOT == NULL) { fprintf(stderr, "ANDROID_NDK_SYSROOT environment variable is not set.\n"); - return 6; + return 5; } if (SYSROOT[0] == '\0') { fprintf(stderr, "ANDROID_NDK_SYSROOT environment variable value should be a non-empty string.\n"); + return 6; + } + + ///////////////////////////////////////////////////////////////// + + size_t targetArgLength = strlen(TARGET) + 10U; + char targetArg[targetArgLength]; + + int ret = snprintf(targetArg, targetArgLength, "--target=%s", TARGET); + + if (ret < 0) { + perror(NULL); return 7; } + ///////////////////////////////////////////////////////////////// + size_t sysrootArgLength = strlen(SYSROOT) + 11U; char sysrootArg[sysrootArgLength]; @@ -98,29 +76,49 @@ int main(int argc, char * argv[]) { ///////////////////////////////////////////////////////////////// - char* argv2[argc + 4]; + const char * options[6] = { "-shared", "-static", "--static", "-pie", "-c", "-o" }; + int indexes[6] = { -1, -1, -1, -1, -1, -1 }; - argv2[0] = cxxc; - argv2[1] = targetArg; - argv2[2] = sysrootArg; + for (int i = 1; i < argc; i++) { + for (int j = 0; j < 6; j++) { + if (strcmp(argv[i], options[j]) == 0) { + indexes[j] = i; + break; + } + } + } - if (action == ACTION_CREATE_SHARED_LIBRARY) { - argv2[3] = (char*)"-fPIC"; + int action = 0; + + if (indexes[0] > 0) { + // if -shared option is specified, then remove -static , --static , -pie options if they also are specified + action = ACTION_CREATE_SHARED_LIBRARY; + } else if ((indexes[1] > 0) || (indexes[2] > 0)) { + // if -shared option is not specified, but -static or --static option is specified, then remove -pie , -Wl,-Bdynamic option if it also is specified + action = ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE; + } else if (indexes[3] > 0) { + action = ACTION_CREATE_DYNAMICALLY_LINKED_EXECUTABLE; + } + + ///////////////////////////////////////////////////////////////// + + char* argv2[argc + 5]; + + char sonameArg[100]; sonameArg[0] = '\0'; + if (action == ACTION_CREATE_SHARED_LIBRARY) { for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-static") == 0) { - argv2[i + 3] = (char*)"-fPIC"; + argv2[i] = (char*)"-fPIC"; } else if (strcmp(argv[i], "--static") == 0) { - argv2[i + 3] = (char*)"-fPIC"; + argv2[i] = (char*)"-fPIC"; } else if (strcmp(argv[i], "-pie") == 0) { - argv2[i + 3] = (char*)"-fPIC"; + argv2[i] = (char*)"-fPIC"; } else { - argv2[i + 3] = argv[i]; + argv2[i] = argv[i]; } } - char sonameArg[100]; sonameArg[0] = '\0'; - char * outputFilePath = NULL; char * outputFileName = NULL; @@ -194,37 +192,47 @@ int main(int argc, char * argv[]) { regfree(®ex); } - - if (sonameArg[0] == '\0') { - argv2[argc + 3] = NULL; - } else { - argv2[argc + 3] = sonameArg; - argv2[argc + 4] = NULL; - } } else if (action == ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE) { for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-rdynamic") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else if (strcmp(argv[i], "-Wl,--export-dynamic") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else if (strcmp(argv[i], "-Wl,-Bdynamic") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else if (strcmp(argv[i], "-pie") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else { - argv2[i + 2] = argv[i]; + argv2[i] = argv[i]; } } - - argv2[argc + 2] = NULL; } else { for (int i = 1; i < argc; i++) { - argv2[i + 2] = argv[i]; + argv2[i] = argv[i]; } + } + + ///////////////////////////////////////////////////////////////// + + argv2[0] = cxxc; + argv2[argc] = targetArg; + argv2[argc + 1] = sysrootArg; + + if (action == ACTION_CREATE_SHARED_LIBRARY) { + argv2[argc + 2] = (char*)"-fPIC"; + if (sonameArg[0] == '\0') { + argv2[argc + 3] = NULL; + } else { + argv2[argc + 3] = sonameArg; + argv2[argc + 4] = NULL; + } + } else { argv2[argc + 2] = NULL; } + ///////////////////////////////////////////////////////////////// + execv (cxxc, argv2); perror(cxxc); return 255; diff --git a/wrapper-target-cc.c b/wrapper-target-cc.c index 2f14743..6aa60d6 100644 --- a/wrapper-target-cc.c +++ b/wrapper-target-cc.c @@ -10,32 +10,6 @@ #define ACTION_CREATE_DYNAMICALLY_LINKED_EXECUTABLE 4 int main(int argc, char * argv[]) { - const char * options[6] = { "-shared", "-static", "--static", "-pie", "-c", "-o" }; - int indexes[6] = { -1, -1, -1, -1, -1, -1 }; - - for (int i = 1; i < argc; i++) { - for (int j = 0; j < 6; j++) { - if (strcmp(argv[i], options[j]) == 0) { - indexes[j] = i; - break; - } - } - } - - int action = 0; - - if (indexes[0] > 0) { - // if -shared option is specified, then remove -static , --static , -pie options if they also are specified - action = ACTION_CREATE_SHARED_LIBRARY; - } else if ((indexes[1] > 0) || (indexes[2] > 0)) { - // if -shared option is not specified, but -static or --static option is specified, then remove -pie , -Wl,-Bdynamic option if it also is specified - action = ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE; - } else if (indexes[3] > 0) { - action = ACTION_CREATE_DYNAMICALLY_LINKED_EXECUTABLE; - } - - ///////////////////////////////////////////////////////////////// - char * const cc = getenv("ANDROID_NDK_CC"); if (cc == NULL) { @@ -62,30 +36,34 @@ int main(int argc, char * argv[]) { return 4; } - size_t targetArgLength = strlen(TARGET) + 10U; - char targetArg[targetArgLength]; - - int ret = snprintf(targetArg, targetArgLength, "--target=%s", TARGET); - - if (ret < 0) { - perror(NULL); - return 5; - } - ///////////////////////////////////////////////////////////////// const char * const SYSROOT = getenv("ANDROID_NDK_SYSROOT"); if (SYSROOT == NULL) { fprintf(stderr, "ANDROID_NDK_SYSROOT environment variable is not set.\n"); - return 6; + return 5; } if (SYSROOT[0] == '\0') { fprintf(stderr, "ANDROID_NDK_SYSROOT environment variable value should be a non-empty string.\n"); + return 6; + } + + ///////////////////////////////////////////////////////////////// + + size_t targetArgLength = strlen(TARGET) + 10U; + char targetArg[targetArgLength]; + + int ret = snprintf(targetArg, targetArgLength, "--target=%s", TARGET); + + if (ret < 0) { + perror(NULL); return 7; } + ///////////////////////////////////////////////////////////////// + size_t sysrootArgLength = strlen(SYSROOT) + 11U; char sysrootArg[sysrootArgLength]; @@ -98,29 +76,49 @@ int main(int argc, char * argv[]) { ///////////////////////////////////////////////////////////////// - char* argv2[argc + 4]; + const char * options[6] = { "-shared", "-static", "--static", "-pie", "-c", "-o" }; + int indexes[6] = { -1, -1, -1, -1, -1, -1 }; - argv2[0] = cc; - argv2[1] = targetArg; - argv2[2] = sysrootArg; + for (int i = 1; i < argc; i++) { + for (int j = 0; j < 6; j++) { + if (strcmp(argv[i], options[j]) == 0) { + indexes[j] = i; + break; + } + } + } - if (action == ACTION_CREATE_SHARED_LIBRARY) { - argv2[3] = (char*)"-fPIC"; + int action = 0; + + if (indexes[0] > 0) { + // if -shared option is specified, then remove -static , --static , -pie options if they also are specified + action = ACTION_CREATE_SHARED_LIBRARY; + } else if ((indexes[1] > 0) || (indexes[2] > 0)) { + // if -shared option is not specified, but -static or --static option is specified, then remove -pie , -Wl,-Bdynamic option if it also is specified + action = ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE; + } else if (indexes[3] > 0) { + action = ACTION_CREATE_DYNAMICALLY_LINKED_EXECUTABLE; + } + + ///////////////////////////////////////////////////////////////// + + char* argv2[argc + 5]; + + char sonameArg[100]; sonameArg[0] = '\0'; + if (action == ACTION_CREATE_SHARED_LIBRARY) { for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-static") == 0) { - argv2[i + 3] = (char*)"-fPIC"; + argv2[i] = (char*)"-fPIC"; } else if (strcmp(argv[i], "--static") == 0) { - argv2[i + 3] = (char*)"-fPIC"; + argv2[i] = (char*)"-fPIC"; } else if (strcmp(argv[i], "-pie") == 0) { - argv2[i + 3] = (char*)"-fPIC"; + argv2[i] = (char*)"-fPIC"; } else { - argv2[i + 3] = argv[i]; + argv2[i] = argv[i]; } } - char sonameArg[100]; sonameArg[0] = '\0'; - char * outputFilePath = NULL; char * outputFileName = NULL; @@ -194,37 +192,47 @@ int main(int argc, char * argv[]) { regfree(®ex); } - - if (sonameArg[0] == '\0') { - argv2[argc + 3] = NULL; - } else { - argv2[argc + 3] = sonameArg; - argv2[argc + 4] = NULL; - } } else if (action == ACTION_CREATE_STATICALLY_LINKED_EXECUTABLE) { for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-rdynamic") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else if (strcmp(argv[i], "-Wl,--export-dynamic") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else if (strcmp(argv[i], "-Wl,-Bdynamic") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else if (strcmp(argv[i], "-pie") == 0) { - argv2[i + 2] = (char*)"-static"; + argv2[i] = (char*)"-static"; } else { - argv2[i + 2] = argv[i]; + argv2[i] = argv[i]; } } - - argv2[argc + 2] = NULL; } else { for (int i = 1; i < argc; i++) { - argv2[i + 2] = argv[i]; + argv2[i] = argv[i]; } + } + + ///////////////////////////////////////////////////////////////// + + argv2[0] = cc; + argv2[argc] = targetArg; + argv2[argc + 1] = sysrootArg; + + if (action == ACTION_CREATE_SHARED_LIBRARY) { + argv2[argc + 2] = (char*)"-fPIC"; + if (sonameArg[0] == '\0') { + argv2[argc + 3] = NULL; + } else { + argv2[argc + 3] = sonameArg; + argv2[argc + 4] = NULL; + } + } else { argv2[argc + 2] = NULL; } + ///////////////////////////////////////////////////////////////// + execv (cc, argv2); perror(cc); return 255;