[phobos] 32 and 64 bit libraries on Linux
Jonathan M Davis
jmdavisProg at gmx.com
Tue Jan 4 18:44:15 PST 2011
On Tuesday, January 04, 2011 15:18:16 Walter Bright wrote:
> The command and the barf:
>
> gcc foo.o -o foo -m32 -Xlinker -L/home/walter/cbx/mars1/phobos -lphobos
> -lpthread -lm
> /usr/bin/ld: skipping incompatible
> /home/walter/cbx/mars1/phobos/libphobos.a when searching for -lphobos
> /usr/bin/ld: cannot find -lphobos
> collect2: ld returned 1 exit status
> --- errorlevel 1
>
>
> So, what to do?
>
> 1. what to name the libraries?
> 2. where to put the libraries?
> 3. how should dmd invoke gcc to do the linking?
> 4. what goes in dmd.conf?
>
> 1,2,3 for -m32, -m64, and the default?
I would think that the issue is that the correct libphobos.a isn't on the
linker's path. It looks like /home/walter/cbx/mars1/phobos/libphobos.a is the
wrong version. I believe that for -lphobos to work, the library must be named
exactly libphobos.a, be compiled for the correct architecture, and be in the
linker's bath. So, if you don't have a libphobos.a of the correct architecture
on the linker's path, then the linking will fail.
If both the 32-bit and 64-bit versions are included in the linker's path, then I
would expect the linker to select the correct one. So, if you had directories
such as lib32 and lib64 in the distributed zip file, both of them have a
libphobos.a of the corresponding architecture, and dmd.conf includes -L
arguments for both directories, then the linker should find them and use the
correct one. Then, if the user or distribution maintainer wishes to put them
elsewhere (such as /usr/lib or /usr/lib64), then they either just move them to
the desired location and alter dmd.conf so that the -L arguments point to
wherever they put the libraries (or probably just remove the -L arguments if
they put the libraries somewhere where ld already looks on their system).
So, I would think that the correct things to do would be
1. Name them both libphobos.a.
2. Put the libraries in separate directories - probably named lib32 and lib64 -
somewhere in the zip file (you should probably just replace the current lib
directories with a lib32 and lib64 directory).
4. Assuming that you replaced linux/lib with linux/lib32 and linux/lib64, then
you remove -L-L%@P%/../lib from the current dmd.conf and add -L-L%@P%/../lib32
and -L-L%@P%/../lib64. If you're compiling with -m32, the linker will use the
32-bit version, and if you're compiling with -m64, it'll use the 64-bit version.
Anyone who wants to put the libraries elsewhere can just edit their dmd.conf
accordingly.
3. I'm not all that well-versed in gcc, so maybe there's some nuance I'm
missing. But what you're doing there looks right as long as the -L flags point to
the correct directories. Use -m32 for 32-bit builds and -m64 for 64-bit builds.
Now, I'm not quite sure how you'd deal with the default value for -m. Normally,
I'd expect you to have a 32-bit version of dmd if you're on a 32-bit system and
a 64-bit version of dmd if you're on a 64-bit system. Then the 32-bit version
defaults to -m32, and the 64-bit version defaults to -m64. But as I understand
it, you're not currently planning to do a 64-bit version of dmd.... gcc will be
32-bit or 64-bit and therefore will default to the correct architecture if you
don't give it a value for -m, but dmd is still going to need to know the
architecture for the compilation phase, so you can't just skip the -m when
linking and expect that to work. It sounds like dmd is going to need a way to
know what architecture it's currently compiling on, or it's going to have to
default to 32-bit (which would be less than ideal). Once it's determined the
correct architecture, it can use that for the compilation phase, and it will
know whether to use -m32 or -m64 in the linking phase.
I am by no means an expert on how linking and libraries work on Linux, but I
have been using primarily 64-bit multilib Linux systems for a while, so I think
that I have a fair grasp of the situation, and I _think_ that what I've said is
correct, but I could be missing something vital. If this information isn't
enough, then hopefully someone else more knowledgeable can chime in.
- Jonathna M Davis
More information about the phobos
mailing list