linker_error.c 1.4 KB
Newer Older
1 2 3 4
#include "ghcconfig.h"
#include <stdio.h>
#include <stdlib.h>
#include "Rts.h"
5 6 7
#if defined(mingw32_HOST_OS)
#include <malloc.h>
#endif
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

#define ITERATIONS 10

typedef int testfun(int);

int main (int argc, char *argv[])
{
    testfun *f;
    int i, r;
#if defined(mingw32_HOST_OS)
    wchar_t *obj;
#else
    char *obj;
#endif

    hs_init(&argc, &argv);

    initLinker_(0);

    // Load object file argv[1] repeatedly

    if (argc != 2) {
        errorBelch("syntax: linker_error <object-file>");
        exit(1);
    }

#if defined(mingw32_HOST_OS)
    size_t len = mbstowcs(NULL, argv[1], 0) + 1;
    if (len == -1) {
        errorBelch("invalid multibyte sequence in argument %d: %s", i, argv[i]);
        exit(1);
    }
    wchar_t *buf = (wchar_t*)_alloca(len * sizeof(wchar_t));
    size_t len2 = mbstowcs(buf, argv[1], len);
    if (len != len2 + 1) {
        errorBelch("something fishy is going on in argument %d: %s", i, argv[i]);
        exit(1);
    }
    obj = buf;
#else
    obj = argv[1];
#endif

    for (i=0; i < ITERATIONS; i++) {
        r = loadObj(obj);
        if (!r) {
54
            debugBelch("loadObj(%s) failed\n", obj);
55 56 57 58
            continue;
        }
        r = resolveObjs();
        if (!r) {
59
            debugBelch("resolveObjs failed\n");
60 61 62 63 64 65 66 67 68 69
            unloadObj(obj);
            continue;
        }
        errorBelch("loading succeeded");
        exit(1);
    }

    hs_exit();
    return 0;
}