tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] unrecognized filetype / link error


From: Peter \"Firefly\" Lund
Subject: Re: [Tinycc-devel] unrecognized filetype / link error
Date: Fri, 2 May 2003 23:31:01 +0200 (MEST)

On Fri, 2 May 2003, Jens Arm wrote:

> address@hidden tinycc]$ cat /usr/lib/libc.so
> /* GNU ld script
>    Use the shared library, but some functions are only in
>    the static library, so try that secondarily.  */
> OUTPUT_FORMAT(elf32-i386)
> GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )

OUTPUT_FORMAT is the culprit.

This is the function that loads a linker script:

/* interpret a subset of GNU ldscripts to handle the dummy libc.so
   files */
static int tcc_load_ldscript(TCCState *s1)
{
    char cmd[64];
    char filename[1024];
    int t;

    ch = file->buf_ptr[0];
    ch = handle_eob();
    for(;;) {
        t = ld_next(s1, cmd, sizeof(cmd));
        if (t == LD_TOK_EOF)
            return 0;
        else if (t != LD_TOK_NAME)
            return -1;
        if (!strcmp(cmd, "INPUT") ||
            !strcmp(cmd, "GROUP")) {
            t = ld_next(s1, cmd, sizeof(cmd));
            if (t != '(')
                expect("(");
            t = ld_next(s1, filename, sizeof(filename));
            for(;;) {
                if (t == LD_TOK_EOF) {
                    error_noabort("unexpected end of file");
                    return -1;
                } else if (t == ')') {
                    break;
                } else if (t != LD_TOK_NAME) {
                    error_noabort("filename expected");
                    return -1;
                }
                tcc_add_file(s1, filename);
                t = ld_next(s1, filename, sizeof(filename));
                if (t == ',') {
                    t = ld_next(s1, filename, sizeof(filename));
                }
            }
        } else {
            return -1;
        }
    }
    return 0;
}

I guess adding an if (!strcmp(cmd, "OUTPUT_FORMAT")) would help:

  for(;;) {
    ...
    if (!strcmp(cmd, "OUTPUT_FORMAT")) {
        t = ld_next(s1, cmd, sizeof(cmd));
        if (t != '(')
            expect("(");
        t = ld_next(s1, cmd, sizeof(cmd)); /* dummy - should be elf32-i386 */
        t = ld_next(s1, cmd, sizeof(cmd));
        if (t != ')')
            expect(")");
    } else if (!strcmp(...)
    ...
  }

-Peter

"Of course, I'm not unbiased, but in my humble opinion, I've
  gotten close to something that I can be really proud of."
 -- Knuth on The Art of Computer Programming.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]