Re: [Vala] private extern class methods.

The generated (problematic) ccode, declares a static prototype for an
extern symbol, which I believe is the cause of the problem. After
replacing the declaration with extern keyword, the library is no longer
a SE trouble maker.

The library was built with a DISABLE_STATIC libtool with
-Wl,--as-needed. I believe -fPIC are always automatically added when
real shared-libraries are built on applicable platforms.

I am totally confused with what was happening inside the linker world.
I had same issues when I forgot declaring the prototypes of extern
symbols in the source files for building shared libraries though.

On Mon, 2009-04-06 at 19:38 +0200, pancake wrote:
The same bug should appear with Solaris and the Sun Studio (aka Forte 

you should build everything with -fPIC, can you provide more information 
about your
build ? console output?

SElinux doesnt allows symbol relocation because it can be dangerous (can 
be used
for in-memory patching using the linux loader) which is permitted, on 
normal linux,
but forbidden in selinux for obvious reasons.

This also happens when you link a blob compiled without -fPIC against a 
static library
that isnot compiled with relocatable code (no -fPIC) the reason is taht 
the non-relocatable
code is compiled to live at a certain offset, and pic code generates 
some stubs to know
where is and how to reach all the data from their position (like 
oldschool viruses did),
you cannot mix pic-nonpic code in an application. well.. default linux 
allows you to do this,
but its a bit ugly workaround ;)

Yu Feng wrote:
Dear list,

I encountered a very hidden problem with private extern class methods,
which I would like to share with you.

The scenario is like this. It compiles, links. everything seems fine
until the library is installed: the produced .so file will have a wrong
reloc symbol which doesn't work with SELinux!):

A member function of a class is externally written in C.

# Class.vala
public class Class {
    private extern static void func();
# Class-ccode.c
void class_func() {
// Do stuff

The generated ccode:
# Class.c
static void func();

This seems to be a bug in valac. 
The private extern method actually should be declared without the static
keyword but with an extern instead.



Vala-list mailing list
Vala-list gnome org

Vala-list mailing list
Vala-list gnome org

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