Update:
I've now tried removing the -lsimpl from the commands, but am still
getting the following error when calling using execv(p):
(on x86-64)
../lib/gcc/x86_64-linux-gnu/4.3.3/../../../../lib/crt1.o: In function
`_start':
/build/buildd/glibc-2.9/csu/../sysdeps/x86_64/elf/start.S:109: undefined
reference to `main'
collect2: ld returned 1 exit status
(on x86)
../lib/gcc/x86_64-linux-gnu/4.3.3/../../../../lib/crt1.o: In function
`_start':
/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:115: undefined
reference to `main'
collect2: ld returned 1 exit status
However, when compiling from the shell, it works no problem.
These were both attempted on Ubuntu 9.04. My old computer had Ubuntu
8.04 on, and worked, and AFAIK I didn't change any code between
switching over to the new computer.
I've tried looking for whether this is an OS issue, but haven't found a
definitive answer yet. The above errors are not related to any of my
code, but to that used by gcc/ld.
I think I need to add something to the environment, but am not sure what.
Any ideas would be gratefully received.
Marcus.
Marcus Clyne wrote:
> Hi,
>
>
> Kai Ruottu wrote:
>> Marcus Clyne wrote:
>>
>>> I'm trying to create a shared object file calling GCC using execvp,
>>> but am getting some errors.
>>
>> Does it work directly from the shell?
> Yes
>>
>>> First - .o creation, using the following options:
>>>
>>> ---------------------
>>> -fPIC -o /tmp/simpl-so/objs/10.o -I/simpl/dev/src
>>> -I/simpl/dev/src/core \
>>> -I/simpl/dev/src/include -c /t/bufout.c
>>> ---------------------
>>
>> Would the result be identical with these put into the usual command
>> line, with the '.o' got via execvp? Seen with 'size', 'objdump -p',
>> 'readelf -h' etc.
> No, though I'm not sure why. The following results for readelf -h are:
>
> (shell created)
>
> ELF Header:
> Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
> Class: ELF64
> Data: 2's complement, little endian
> Version: 1 (current)
> OS/ABI: UNIX - System V
> ABI Version: 0
> Type: REL (Relocatable file)
> Machine: Advanced Micro Devices X86-64
> Version: 0x1
> Entry point address: 0x0
> Start of program headers: 0 (bytes into file)
> Start of section headers: 1400 (bytes into file)
> Flags: 0x0
> Size of this header: 64 (bytes)
> Size of program headers: 0 (bytes)
> Number of program headers: 0
> Size of section headers: 64 (bytes)
> Number of section headers: 13
> Section header string table index: 10
>
> (execvp created)
>
> ELF Header:
> Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
> Class: ELF64
> Data: 2's complement, little endian
> Version: 1 (current)
> OS/ABI: UNIX - System V
> ABI Version: 0
> Type: REL (Relocatable file)
> Machine: Advanced Micro Devices X86-64
> Version: 0x1
> Entry point address: 0x0
> Start of program headers: 0 (bytes into file)
> Start of section headers: 1384 (bytes into file)
> Flags: 0x0
> Size of this header: 64 (bytes)
> Size of program headers: 0 (bytes)
> Number of program headers: 0
> Size of section headers: 64 (bytes)
> Number of section headers: 13
> Section header string table index: 10
>
>>
>>> This seems to go ok, then calling with the following options:
>>> -------------------------
>>> -fPIC -shared -o /tmp/simpl-so/objs/10.so \
>> > /tmp/simpl-so/objs/10.o -lsimpl
>>> -------------------------
>>
>> And what the 'manual' linking would tell? Does it succeed?
> If you mean by calling gcc from the shell, yes, it does work.
>>
>>> COLLECT_GCC_OPTIONS='-v' '-shared' '-o' '/tmp/simpl-so/objs/10.so'
>>> '-mtune=generic'
>>>
>>> libsimpl is compiled using fPIC too.
>>
>> And with the same '-mtune=generic' ?
> Yes - I hadn't changed it, but I also set it to 'generic' explicitly,
> and the new errors (which are different from the original errors) are
> still the same - I put these in a separate post.
>>
>> -shared
>> Produce a shared object which can then be linked with other objects to
>> form an executable. Not all systems support this option. For
>> predictable results, you must also specify the same set of options
>> that were used to generate code (‘-fpic’, ‘-fPIC’, or model
>> suboptions) when you specify this option.
> I'm actually creating so's that will be linked using dlopen etc - not
> sure if this makes a difference or not.
>
> In any case, it works ok when I use the shell but not when I use
> execv(p) to call gcc.
>
> Thanks,
>
> Marcus.
>