LINUX.ORG.RU

gcc: @object .size problems?


0

0

у кого gcc выше 3.3.3 (или 2.95), не могли бы вы запостить
сюда asm output для вот этого кода?

        struct { int i; char a[]; } a = { .a = "QWERTY" };

с указанием версии, плиз.

спасибо.
★★★★★

а что, != 3.3.3 не должен ругаться вида

$ cat test.c

void foo()
{
    struct {
        int i;
        char a[];
    } a = { .a = "QWERTY" };
}

$ cc -c test.c 
test.c: In function `foo':
test.c:7: error: non-static initialization of a flexible array member
test.c:7: error: (near initialization for `a')

?

// wbr

klalafuda ★☆☆
()

notebook ~ $ gcc tt.c -S && cat tt.s
        .file   "tt.c"
.globl a
        .data
        .align 4
        .type   a, @object
        .size   a, 4
a:
        .zero   4
        .string "QWERTY"
        .ident  "GCC: (GNU) 4.0.2 (Gentoo 4.0.2-r2, pie-8.7.8)"
        .section        .note.GNU-stack,"",@progbits

SatanClaus ★★★
()

хотя в таком виде очевидно идёт:

$ cat test.c 

void foo()
{
    static struct {
        int i;
        const char a[];
    } a = { .a = "QWERTY" };
}

$ cc -c -S test.c 
$ cat test.s 
        .file   "test.c"
        .data
        .align 4
        .type   a.0, @object
        .size   a.0, 4
a.0:
        .zero   4
        .string "QWERTY"
        .text
.globl foo
        .type   foo, @function
foo:
        pushl   %ebp
        movl    %esp, %ebp
        leave
        ret
        .size   foo, .-foo
        .ident  "GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)"

ps: я в курсе, что это именно 3.3.3 :)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от SatanClaus

ну или так..

        .file   "test.c"
.globl a
        .data
        .align 4
        .type   a, @object
        .size   a, 4
a:
        .zero   4
        .string "QWERTY"
        .ident  "GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)"

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от SatanClaus

SatanClaus:

>        .size   a, 4

спасибо.

итого это не ошибка моего компилятора. так я и думал.

а что же делать? как вы, наверное, уже поняли, мне нужно,
чтобы .size отражал "реальный" размер переменной, иначе
ломается ее использование если она определена в dynamic
library (copy-reloc не может работать по понятной причине).

есть у кого-ниюудь идея?

idle ★★★★★
() автор топика
Ответ на: комментарий от idle

Похоже в данном случае компилятор вычисляет .size только при определении функции. Инициализация потом ему побоку. Наверное лучше либо явно указывать размер или явно пользоваться указателем на то что нужно.

SatanClaus ★★★
()
Ответ на: комментарий от SatanClaus

> Наверное лучше либо явно указывать размер

лучше. но как? в этом-то и проблема.

> или явно пользоваться указателем на то что нужно.

нет, это по разным причинам не проходит. нужно именно
name[] в конце структуры.

idle ★★★★★
() автор топика
Ответ на: комментарий от SatanClaus

> Просто вписать размер?
> struct { int i; char a[7]; }

так не выйдет. размер нужно задавать для
переменной, а не для типа.

у нас есть struct ident { ... char name[]; }
затем:

struct ident i1 = { .name = "1" };

struct ident i2 = { .name = "123456789" };

idle ★★★★★
() автор топика
Ответ на: комментарий от idle

Похоже при таком раскладе ничего не поделаешь. Содержимое массива определяется, но уже не в том месте где считается .size Может просто вынести инициализацию структуры из .so и не мучиться.

SatanClaus ★★★
()
Ответ на: комментарий от idle

Пример того как делать не нужно...

Такие фокусы не прокатят, твой код it's ill-formated, т.к. определение  типа имеет incomplete type. Придется тебе выбрать другое решение

aton
()
Ответ на: комментарий от aton

> Пример того как делать не нужно...

расскажите это автору - Linus Torvalds.

> Такие фокусы не прокатят,

ну почему же, вполне даже

> твой код it's ill-formated,

??? у меня не очень с английским

> т.к. определение  типа имеет incomplete type.

хм ? а я думал, "С" такой простой язык, что даже я
могу его выучить.

idle ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.