Static functions
Thiago Macieira
thiago.macieira at kdemail.net
Mon Jan 12 16:00:17 GMT 2004
Bo Thorsen wrote:
>I don't "feel" anything about it - if the symbols are gone from the
> symbol table, then that's all good. But I don't believe so, the file
> static functions are necessary to achieve this. Prove me wrong :-)
You are right. Simple testing reveals:
$ cat test.cpp
int v1;
static int v2;
namespace
{
int v3;
static int v4;
};
main()
{
}
$ nm -C test.o
00000008 B (anonymous namespace)::v3
0000000c b (anonymous namespace)::v4
00000000 T main
00000000 B v1
00000004 b v2
$ readelf -s test.o
Symbol table '.symtab' contains 11 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS test.cpp
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 SECTION LOCAL DEFAULT 2
4: 00000000 0 SECTION LOCAL DEFAULT 3
5: 00000004 4 OBJECT LOCAL DEFAULT 3 v2
6: 0000000c 4 OBJECT LOCAL DEFAULT 3
_ZN13_GLOBAL__N_v12v4E
7: 00000000 0 SECTION LOCAL DEFAULT 4
8: 00000000 4 OBJECT GLOBAL DEFAULT 3 v1
9: 00000008 4 OBJECT GLOBAL DEFAULT 3
_ZN13_GLOBAL__N_v12v3E
10: 00000000 23 FUNC GLOBAL DEFAULT 1 main
Note how 'v2' and 'v4' have a type of 'b' (meaning local .bss), while
'v1' and 'v3' are 'B' (global .bss). The readelf output also reveals
that there are three globally-exported symbols: v1, main and one
C++-mangled symbol ending in 'v3'.
Using a neat trick of gcc extension in ELF targets, we get more:
$ cat test.cpp
int v5 __attribute__((visibility("hidden")));
int v6 __attribute__((visibility("protected")));
int v7 __attribute__((visibility("internal")));
main()
{ }
$ nm test | grep 'v[567]$'
080494e4 B v5
080494e8 B v6
080494ec B v7
$ readelf -s test | grep 'v[567]$'
44: 080494e8 4 OBJECT GLOBAL PROTECTED 22 v6
49: 080494ec 4 OBJECT GLOBAL INTERNAL 22 v7
61: 080494e4 4 OBJECT GLOBAL HIDDEN 22 v5
$ nm test.so | grep 'v[567]$'
00001724 b v5
00001728 B v6
0000172c b v7
$ readelf -s test.so | grep 'v[567]$'
22: 00001728 4 OBJECT GLOBAL PROTECTED 19 v6
41: 0000172c 4 OBJECT LOCAL INTERNAL 19 v7
42: 00001724 4 OBJECT LOCAL HIDDEN 19 v5
44: 00001728 4 OBJECT GLOBAL PROTECTED 19 v6
And here comes the fun part: there are macros for those defined in
kdemacros.h:
#define KDE_NO_EXPORT __attribute__ ((visibility("hidden")))
#define KDE_EXPORT __attribute__ ((visibility("visible")))
#define KDE_PACKED __attribute__((__packed__))
# define KDE_DEPRECATED __attribute__ ((deprecated))
So we just have to use what we already have.
--
Thiago Macieira - Registered Linux user #65028
thiagom (AT) mail (dot) com
ICQ UIN: 1967141 PGP/GPG: 0x6EF45358; fingerprint:
E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: signature
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20040112/e9f1dc22/attachment.sig>
More information about the kde-core-devel
mailing list