LINUX.ORG.RU

Переносимость, Inline-функция fstat


0

0

Народ, есть проблема: нужно из программы не на языке С позвать функцию fstat. Объявляем соответствующий дефинишн... Но проблема в том, что функция fstat объявлена в stat.h как inline и, собственно, в libc.so ее просто-напросто нет. Спрашивается: как организовать это дело, чтобы моя программа была POSIX-переносимой? Может быть, есть какой-то аналог fstat? Нехорошая проблема, но если вдруг кто может подсказать что-нибудь хорошее, буду очень признателен.


Слушайте, товарищ, функция fstat *является* функцией POSIX (см. соотв. man) То, что она объявлена как inline означает только, что С99-aware компилятор (как gcc) *может* хотя и не обязан вставлять ее тело непосредственно в код. Более того, она несомненно *есть* в libc. Как бы то ни было, POSIXу совершенно наплевать (AFAIK) объявлена ли функция inline или нет (строго говоря, во времена оригинального POSIXа никакого inline в С вообще не было) Вообще, постинги уважаемого товарища производят (sorry) впечатлние "слышал звон, да не знает где он" Могу еще раз порекендовать прочесть хотя бы info libc Standards

aa5779
()

ты ее видимо не там искал, у меня(дебиан) /lib/libc*.so пострипанная:

nm /lib/libc-2.2.5.so nm: /lib/libc-2.2.5.so: no symbols

а вот если дебаговую версию, то все на месте:

nm /usr/lib/libc.a | grep fstat >/dev/null && echo "found" found

а по поводу inline то данный параметр рулится -fkeep-inline-functions или как-то так. но, в принципе, если на функцию есть хоть одна ссылка из внешнего модуля то имхо компилятор _обязан_ включать тело функции в код.

anonymous
()

Слушайте, товарищ аа, может, хватит строить из себе крутого умника-всезнайки? Я прекрасно знаю, что такое inline. Вы, дорогуша, поищите в libc.so.6 символ fstat. Сударь, я знаю, что fstat *есть* в libc. Но покажите мне ее в динамической libc.so. Причем тут POSIX, милейший? ...Нашли? Ах, нету, да? А? Нету? Ну вот.... А мне-то только это и интересно, понимаете ли Вы, сударь? И я спрашивал у общественности (не у Вас), можно ли сделать так, чтобы функи были из libc.so, делали что мне хочется, и прога была POSIX-comp.

JekLove
() автор топика

Нет, это уже переходит всякие границы. Какое отношение имеет libc.so к POSIX? Может быть, вы думаете, что POSIX регламентирует *двоичную совместимость* программ? Если так, то вы *очень* глубоко заблуждаетесь. POSIX имеет отношение *только* к исходным текстам. Соответственно -- есть ли эта функция в libc или нет -- это совершенно не имеет значения. Все равно программа, собранная под Linux в произволной POSIX-совместимой среде работать не будет.

aa5779
()

Надо сказать, поразительная самоуверенность для человека который не так давно спрашивал, чем отличаются POSIX от ANSI C Кстати, да будет вам известно, что POSIX compliance далеко не исчерпывается списком функций

aa5779
()

Дорогой мой, ну что Вы мне это рассказываете? Я знаю все это. Действительно, Вы мне кое-что когда-то объяснили. Ежу понятно, что программа, собранная на Линукс, не будет работать в произвольной ПОСИКС-системе. Удивили мир... Или Вы всегда считаете окружающих идиотами, да? Мне как раз и нужно, чтобы программа была POSIX-complicant на уровне исходных текстов, но под Линукс она использует libc.so, вот мне и надо, чтобы она была совместимой и с POSIX, __и_с_libc.so__ Неужели это так сложно понять...

JekLove
() автор топика

ей ну вы чего?

$ 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. */
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )
$ nm /usr/lib/libc_nonshared.a|grep fstat
fstat.oS:
00000000 T __fstat
00000000 W fstat
fstat64.oS:
00000000 T fstat64

вот вам и ответ .. fstat нету в libc.so зато она есть в libc_nonshared и по каким то причинам не может быть shared - там похоже ничего нового не придумали :) тупо делается сискол(номер у fstat(2) POSIXовский) и все ..

lg ★★
()

Так, объясняю еще раз по пунктам 1. Функция fstat является функцией POSIX.1, поэтому ее использование не может сделать программу non-conforming 2. Никакой другой функции с эквивалентной функциональностью в POSIX.1 нет 3. Посколку glibc 2.2 удовлетворяет стандарту POSIX.1 (равно как и многим другим стандартам), функция fstat входит в glibc 2.2 4. То, каким именно образом библиотечная функция объявлена может влиять на производительность, или на диагностику, но никак не на переносимость кода, использующего данную функцию. 5. Как показал третий отвечавший (anonymous) функция fstat в libc.so.6 есть (а иначе и быть не может)

Разумеется, если компилятор расширяет, согласно inline-определению функцию fstat до вызова __fxstat (или что там) а в какой-то будущей версии glibc вместо __fxstat будет __foobarstat, то программа с этой версией glibc работать не будет. НО! Это уже касается двоичной совместимости, а не исходниковой.

Еще вопросы есть?

aa5779
()

Если твой язык (который не си) позволяет тебе делать линковку с libc.so, то он, наверно, позволит слинковать твою прогу с каким-нибудь объектником на си? Если да, то можно сделать для fstat (и прочих нужных тебе inline) "обертку" на си. Например, так:

int my_fstat(int fd, struct stat *s)
{
return fstat(fd, s);
}

Эту функцию положи в какой-нибудь file.c. Вставь в Makefile компиляцию этого файла (средствами cc). В своей проге замени fstat на my_fstat. Слинкуй прогу с file.o.

Способ, конечно, кривой, не спорю. Но другого пока в голову не приходит.

nobody ★★
()

Слушайте, сорри всем, в особенности JekLove -- в том смысле, что частицу *не* я проглядел. Я-то думал, что это все о Сях речь. Однако же в таком случае вопрос о POSIX-совместимости отпадает -- поскольку POSIX.1 регламентирует *только* С интерфейсы. Для других языков вообще говоря должны быть отдельные документы, в частности для Fortran'а это POSIX.9 -- для большинства других языков POSIX bindings, насколько мне известно, отсутствуют. Далее. Вообще говоря, чтобы вызвать функцию из C библиотеки из не-C нужно иметь ее описанной на данном языке -- поскольку дело тут далеко не только в inlineовости. В данном конкретном случае дело осложняется тем, что fstat использует структуру для передачи данных. Иными словами реально необходимо в языке иметь аналог или binding функции fstat, объявленный в интерфейсном или заголовочном файле, т. е. там где вообще все системные файлы объявляются. А иначе ждите баааальших глюков. Повторюсь, однако, еще раз -- POSIX ко всему этому не имеет никакого отношения.

aa5779
()

Вы бы хоть сказали, какой язык

aa5779
()

2 aa5779: ОК, я тоже погорячился и наговорил резких слов. Приношу свои извинения.

Проблема в следующем: Есть библиотека, часть которой написана на Modula-2 (очень большая часть), а маленькая часть - на С. Необходимо отказаться от использования gcc, т.е. всю библиотеку перенести на Modula-2 и компилировать только модуловским компилятором. В сишной части используются стандартные POSIX функции, вроде того же fstat. Под линуксом библиотека использует libc, причем необходимо обеспечить динамическую линковку. Ну и вот... Отсюда и проблемы. Необходимо, чтобы переписанная часть использовала только POSIX-функции. Конечно, аналоги всех прототипов функций и объявлений структур написаны и все работает, за исключением вот этой ерунды с инлайнами.

JekLove
() автор топика

Ну не знаю. Похоже, эта проблема не решается -- оказывается, семейство stat намеренно реализовано как inline, чтобы можно было, видите ли, изменять layout структуры stat_t не меняя старшего номера libc.so.6. Так что если они не развертываются inline, то влинковываются статически....

aa5779
()

Нннда... Ну ладно, все равно спасибо за внимание :)

JekLove
() автор топика

Вообще мне сама постановка задачи представляется странной. Я очень плохо знаю Modula2 и уж совсем не представляю именно вашей реализации, но сама идея использовать libc в не С/С++-программах (и не программах собранных с помощью GNU tools) представляется мне странной. Неужели в реализации Modula2 под Linux нет собственного интерфейса к системным вызовам (а fstat -- это в конечном счете системный вызов)?

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