Моно взаимодействие: загрузка 32-битной разделяемой библиотеки не работает в моей 64-битной системе - PullRequest
3 голосов
/ 28 марта 2012

У меня проблема с запуском простого примера взаимодействия в моей системе. Я создал простую 32-битную разделяемую библиотеку с именем libtest.so (c ++)

g++ -c -fpic test.cpp -m32
g++ -shared -fpic -o libtest.so test.o -m32

Моя система: Ubuntu Linux 10.04 x86_64

Mono C # версия компилятора 2.4.4.0

Кроме того, у меня есть пример программы на c # с использованием моей общей библиотеки:

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;

public class Test
{
        [DllImport("libdl.so")] 
        static extern IntPtr dlopen(string filename, int flags); 

        [DllImport("libdl.so")] 
        static extern IntPtr dlclose(IntPtr handle);

        [DllImport ("./libtest.so")]
        private static extern void HelloWorld();

        [DllImport ("./libtest.so",EntryPoint="Test")]
        private static extern int Testl(int a,int b); 

        public static int Main(string[] args)
        {   
                IntPtr handle = dlopen("./libtest.so",2);
                if(handle == IntPtr.Zero)
                {   
                       Console.WriteLine("Error loading shared library");
                        return -1; 
                }   

                HelloWorld();
                int ret = Testl(116,1);
                Console.WriteLine("Result from shared-Librarry Call: " + ret);

                dlclose(handle);
                return 0;
        }   
}

Проблема: загрузка библиотеки не работает.

экспорт MONO_LOG_LEVEL = debug дает мне следующую подсказку: Mono-INFO: ошибка загрузки библиотеки DllImport './libtest.so: неправильный класс ELF: ELFCLASS32'.

Ну, я думаю, что mono запускает мою программу в 64-битном режиме, и поэтому она не может вызвать 32-битную разделяемую библиотеку? Если я собираю общую библиотеку в 64-битном режиме (без -m32), все работает отлично !!

Мой моно-компилятор 2.4.4. не имеет возможности указать платформу с / platform: x86 и, следовательно, я установил версию 2.10, но использование ее также не работает.

/opt/mono-2.10/bin/gmcs /platform:x86 sharpCall.cs

Есть ли возможность загрузить 32-битные разделяемые библиотеки в 64-битной системе?

Ответы [ 3 ]

4 голосов
/ 29 марта 2012

Проблема в том, что у вас установлена ​​64-битная версия Mono, которая может только P / Invoke в 64-битные собственные библиотеки, не может P / Invoke в 32-битные собственные библиотеки.

Флаг -platform: x86 предназначен для компилятора C # , а не среды выполнения, и не указывает на время выполнения для использования 32-битного пространства памяти.

Вам нужно установить 32-битную версию Mono в вашей системе Ubuntu, если вы хотите использовать P / Invoke в 32-битных собственных библиотеках.

0 голосов
/ 28 марта 2012

Есть ли возможность загрузить 32-битные разделяемые библиотеки в 64-битной системе?

Да, но только если вы компилируете программу, которая использует указанные разделяемые библиотеки, в 32-битную систему.-битный процесс.

Ну, я думаю, что mono запускает мою программу в 64-битном режиме и, следовательно, не может вызвать 32-битную разделяемую библиотеку?Если я создаю разделяемую библиотеку в 64-битном режиме (без -m32), все работает отлично !!

Конечно, это происходит.Просто скомпилируйте программу с флагом m32, и у вас не должно возникнуть проблем.

0 голосов
/ 28 марта 2012

Нельзя загрузить 32-битный модуль в 64-битный процесс.Либо запустите 32-битный процесс, либо скомпилируйте свой собственный модуль как 64-битный модуль.

...