天天看點

linux 交叉編譯c檔案,c-Windows上的Linux交叉編譯(連結器輸出檔案在...

我正在嘗試使用clang和已編譯為具有elf64支援的ld版本在Windows上為linux ELF檔案設定交叉編譯. clang編譯部分很好,它輸出在Linux上連結時可以工作的ELF obj檔案.我的測試用例cpp隻是主要包含一個printf語句.

為了在Windows上嘗試連結,我從ubuntu安裝程式中複制了所有庫,并以正确的順序指定了作為連結器參數所需的那些(如它們在g所執行的ld調用中所示).問題是,輸出檔案與Linux上生成的檔案略有不同,并且無法作為可執行檔案運作.我注意到,例如,在Windows上連結的版本中,存在未定義的符号“ printf”,在Linux版本中它似乎已變成“ puts”.

無論如何,我想知道是否有人知道這裡發生了什麼.

我實際的連結參數是這樣的:

LFLAGS = --build-id --eh-frame-hdr --oformat elf64-x86-64 -m elf_x86_64 --hash-style=gnu --as-needed -z relro --verbose

LIBDIRS = -LI:\\Linux\\gcc\\x86_64-linux-gnu\\4.8.1 -LI:\\Linux\\libs\\lib\\x86_64-linux-gnu -LI:\\Linux\\libs\\lib -LI:\\Linux\\lib\\x86_64-linux-gnu -LI:\\Linux\\lib

LIBS = I:\Linux\libs\lib\x86_64-linux-gnu\\ld-2.17.so I:\\Linux\\lib\\x86_64-linux-gnu\\crt1.o I:\\Linux\\lib\\x86_64-linux-gnu\\crti.o I:\\Linux\\gcc\\x86_64-linux-gnu\\4.8.1\\crtbegin.o Test.o I:\Linux\lib\x86_64-linux-gnu\\libstdc++.so.6.0.18 I:\Linux\libs\lib\x86_64-linux-gnu\\libgcc_s.so.1 I:\Linux\gcc\x86_64-linux-gnu\4.8.1\\libgcc.a I:\Linux\libs\lib\x86_64-linux-gnu\\libc.so.6 I:\Linux\lib\x86_64-linux-gnu\\libc_nonshared.a I:\\Linux\\gcc\\x86_64-linux-gnu\\4.8.1\\crtend.o I:\\Linux\\lib\\x86_64-linux-gnu\\crtn.o

all: $(MAIN)

./ld-new.exe $(LFLAGS) $(LIBDIRS) $(LIBS) -o Test

$(MAIN):

clang $(CFLAGS) $(SYSINCLUDES) -o $(OBJS) -x c++ $(SRCS)

在linux上連結:

==================================================

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o succeeded

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o succeeded

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o succeeded

/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o

attempt to open Test.o succeeded

Test.o

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so succeeded

-lstdc++ (/usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so)

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libm.so failed

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libm.a failed

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libm.so succeeded

-lm (/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libm.so)

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so succeeded

-lgcc_s (/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so)

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.so failed

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.a succeeded

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libc.so failed

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libc.a failed

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libc.so succeeded

opened script file /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libc.so

opened script file /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libc.so

attempt to open /lib/x86_64-linux-gnu/libc.so.6 succeeded

/lib/x86_64-linux-gnu/libc.so.6

attempt to open /usr/lib/x86_64-linux-gnu/libc_nonshared.a succeeded

(/usr/lib/x86_64-linux-gnu/libc_nonshared.a)elf-init.oS

attempt to open /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 succeeded

/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so succeeded

-lgcc_s (/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so)

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.so failed

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.a succeeded

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o succeeded

/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o

attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o succeeded

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o

ld-linux-x86-64.so.2 needed by /lib/x86_64-linux-gnu/libc.so.6

found ld-linux-x86-64.so.2 at /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

在Linux上的nm輸出:

[email protected]:/shared$nm ./Test

0000000000601040 B __bss_start

0000000000601040 b completed.6992

0000000000601030 D __data_start

0000000000601030 W data_start

0000000000400470 t deregister_tm_clones

00000000004004e0 t __do_global_dtors_aux

0000000000600e18 t __do_global_dtors_aux_fini_array_entry

0000000000601038 D __dso_handle

0000000000600e28 d _DYNAMIC

0000000000601040 D _edata

0000000000601048 B _end

00000000004005e4 T _fini

0000000000400500 t frame_dummy

0000000000600e10 t __frame_dummy_init_array_entry

0000000000400718 r __FRAME_END__

0000000000601000 d _GLOBAL_OFFSET_TABLE_

w __gmon_start__

00000000004003e0 T _init

0000000000600e18 t __init_array_end

0000000000600e10 t __init_array_start

00000000004005f0 R _IO_stdin_used

w _ITM_deregisterTMCloneTable

w _ITM_registerTMCloneTable

0000000000600e20 d __JCR_END__

0000000000600e20 d __JCR_LIST__

w _Jv_RegisterClasses

00000000004005e0 T __libc_csu_fini

0000000000400550 T __libc_csu_init

U __libc_start_main@@GLIBC_2.2.5

000000000040052d T main

U puts@@GLIBC_2.2.5

00000000004004a0 t register_tm_clones

0000000000400440 T _start

0000000000601040 D __TMC_END__

在Windows上連結:

==================================================

attempt to open I:\Linux\libs\lib\x86_64-linux-gnu\ld-2.17.so succeeded

I:\Linux\libs\lib\x86_64-linux-gnu\ld-2.17.so

attempt to open I:\Linux\lib\x86_64-linux-gnu\crt1.o succeeded

I:\Linux\lib\x86_64-linux-gnu\crt1.o

attempt to open I:\Linux\lib\x86_64-linux-gnu\crti.o succeeded

I:\Linux\lib\x86_64-linux-gnu\crti.o

attempt to open I:\Linux\gcc\x86_64-linux-gnu\4.8.1\crtbegin.o succeeded

I:\Linux\gcc\x86_64-linux-gnu\4.8.1\crtbegin.o

attempt to open Test.o succeeded

Test.o

attempt to open I:\Linux\lib\x86_64-linux-gnu\libstdc++.so.6.0.18 succeeded

I:\Linux\lib\x86_64-linux-gnu\libstdc++.so.6.0.18

attempt to open I:\Linux\libs\lib\x86_64-linux-gnu\libm-2.17.so succeeded

I:\Linux\libs\lib\x86_64-linux-gnu\libm-2.17.so

attempt to open I:\Linux\gcc\x86_64-linux-gnu\4.8.1\libgcc.a succeeded

attempt to open I:\Linux\lib\x86_64-linux-gnu\libc.so succeeded

opened script file I:\Linux\lib\x86_64-linux-gnu\libc.so

attempt to open /lib/x86_64-linux-gnu/libc.so.6 succeeded

/lib/x86_64-linux-gnu/libc.so.6

attempt to open /usr/lib/x86_64-linux-gnu/libc_nonshared.a succeeded

(I:/Linux/lib/x86_64-linux-gnu/libc_nonshared.a)elf-init.oS

attempt to open /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 succeeded

/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

attempt to open I:\Linux\lib\x86_64-linux-gnu\libc_nonshared.a succeeded

attempt to open I:\Linux\gcc\x86_64-linux-gnu\4.8.1\crtend.o succeeded

I:\Linux\gcc\x86_64-linux-gnu\4.8.1\crtend.o

attempt to open I:\Linux\lib\x86_64-linux-gnu\crtn.o succeeded

I:\Linux\lib\x86_64-linux-gnu\crtn.o

ld-linux-x86-64.so.2 needed by I:/Linux/libs/lib/x86_64-linux-gnu/libc-2.17.so

found ld-2.17.so at I:\Linux\libs\lib\x86_64-linux-gnu\ld-2.17.so

Windows生成可執行檔案的nm輸出

[email protected]:/shared$nm ./Test

0000000000601040 B __bss_start

0000000000601040 b completed.6992

0000000000601030 D __data_start

0000000000601030 W data_start

0000000000400470 t deregister_tm_clones

00000000004004e0 t __do_global_dtors_aux

0000000000600e18 t __do_global_dtors_aux_fini_array_entry

0000000000601038 D __dso_handle

0000000000600e28 d _DYNAMIC

0000000000601040 D _edata

0000000000601048 B _end

00000000004005f4 T _fini

0000000000400500 t frame_dummy

0000000000600e10 t __frame_dummy_init_array_entry

0000000000400728 r __FRAME_END__

0000000000601000 d _GLOBAL_OFFSET_TABLE_

w __gmon_start__

00000000004003d8 T _init

0000000000600e18 t __init_array_end

0000000000600e10 t __init_array_start

0000000000400600 R _IO_stdin_used

w _ITM_deregisterTMCloneTable

w _ITM_registerTMCloneTable

0000000000600e20 d __JCR_END__

0000000000600e20 d __JCR_LIST__

w _Jv_RegisterClasses

00000000004005f0 T __libc_csu_fini

0000000000400560 T __libc_csu_init

U __libc_start_main@@GLIBC_2.2.5

0000000000400530 T main

U printf@@GLIBC_2.2.5

00000000004004a0 t register_tm_clones

0000000000400440 T _start

0000000000601040 D __TMC_END__

[email protected]:/shared$./Test

bash: ./Test: No such file or directory

編輯-更多資訊

所謂不運作,是指ubuntu給出以下資訊:

bash: ./Test: No such file or directory

這是檔案/ ldd的結果

[email protected]:/shared$file ./Test

./Test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xee999db5a0e77d05f50d8fd78a27fc3ac52584b1, not stripped

[email protected]:/shared$ldd ./Test

linux-vdso.so.1 => (0x00007ffff2bfe000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5e2b60c000)

/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f5e2b9eb000)

編輯2-

從那以後,我一直試圖接近在linux上複制确切的連結過程.

LFLAGS = --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker I:\\Linux\\libs\\lib\\x86_64-linux-gnu\\ld-2.17.so -z relro --verbose

LIBDIRS = -LI:\\Linux\\gcc\\x86_64-linux-gnu\\4.8.1 -LI:\\Linux\\libs\\lib\\x86_64-linux-gnu -LI:\\Linux\\libs\\lib -LI:\\Linux\\lib\\x86_64-linux-gnu -LI:\\Linux\\lib

LIBS_BEGIN = I:\\Linux\\lib\\x86_64-linux-gnu\\crt1.o I:\\Linux\\lib\\x86_64-linux-gnu\\crti.o I:\\Linux\\gcc\\x86_64-linux-gnu\\4.8.1\\crtbegin.o

LIBS_END = I:\\Linux\\lib\\gcc\\x86_64-linux-gnu\\4.8.1\\libstdc++.so I:\\Linux\\libs\\lib\\x86_64-linux-gnu\\libgcc_s.so.1 I:\\Linux\\gcc\\x86_64-linux-gnu\\4.8.1\\libgcc.a I:\\Linux\\lib\\x86_64-linux-gnu\\libc_nonshared.a I:\\Linux\\libs\\lib\\x86_64-linux-gnu\\ld-linux-x86-64.so.2 I:\\Linux\\libs\\lib\\x86_64-linux-gnu\\libc.so.6 I:\\Linux\\libs\\lib\\x86_64-linux-gnu\\libgcc_s.so.1 I:\\Linux\\gcc\\x86_64-linux-gnu\\4.8.1\\libgcc.a I:\\Linux\\gcc\\x86_64-linux-gnu\\4.8.1\\crtend.o I:\\Linux\\lib\\x86_64-linux-gnu\\crtn.o

all: $(MAIN)

./ld-new.exe $(LFLAGS) -o Test $(LIBS_BEGIN) $(LIBDIRS) $(OBJS) $(LIBS_END)

更新了Windows上的連結:

==================================================

attempt to open I:\Linux\lib\x86_64-linux-gnu\crt1.o succeeded

I:\Linux\lib\x86_64-linux-gnu\crt1.o

attempt to open I:\Linux\lib\x86_64-linux-gnu\crti.o succeeded

I:\Linux\lib\x86_64-linux-gnu\crti.o

attempt to open I:\Linux\gcc\x86_64-linux-gnu\4.8.1\crtbegin.o succeeded

I:\Linux\gcc\x86_64-linux-gnu\4.8.1\crtbegin.o

attempt to open Test.o succeeded

Test.o

attempt to open I:\Linux\lib\gcc\x86_64-linux-gnu\4.8.1\libstdc++.so succeeded

I:\Linux\lib\gcc\x86_64-linux-gnu\4.8.1\libstdc++.so

attempt to open I:\Linux\libs\lib\x86_64-linux-gnu\libgcc_s.so.1 succeeded

I:\Linux\libs\lib\x86_64-linux-gnu\libgcc_s.so.1

attempt to open I:\Linux\gcc\x86_64-linux-gnu\4.8.1\libgcc.a succeeded

attempt to open I:\Linux\lib\x86_64-linux-gnu\libc_nonshared.a succeeded

(I:\Linux\lib\x86_64-linux-gnu\libc_nonshared.a)elf-init.oS

attempt to open I:\Linux\libs\lib\x86_64-linux-gnu\ld-linux-x86-64.so.2 succeede

d

I:\Linux\libs\lib\x86_64-linux-gnu\ld-linux-x86-64.so.2

attempt to open I:\Linux\libs\lib\x86_64-linux-gnu\libc.so.6 succeeded

I:\Linux\libs\lib\x86_64-linux-gnu\libc.so.6

attempt to open I:\Linux\libs\lib\x86_64-linux-gnu\libgcc_s.so.1 succeeded

I:\Linux\libs\lib\x86_64-linux-gnu\libgcc_s.so.1

attempt to open I:\Linux\gcc\x86_64-linux-gnu\4.8.1\libgcc.a succeeded

attempt to open I:\Linux\gcc\x86_64-linux-gnu\4.8.1\crtend.o succeeded

I:\Linux\gcc\x86_64-linux-gnu\4.8.1\crtend.o

attempt to open I:\Linux\lib\x86_64-linux-gnu\crtn.o succeeded

I:\Linux\lib\x86_64-linux-gnu\crtn.o

ld-linux-x86-64.so.2 needed by I:\Linux\libs\lib\x86_64-linux-gnu\libc.so.6

found ld-linux-x86-64.so.2 at I:\Linux\libs\lib\x86_64-linux-gnu\ld-linux-x86-64

.so.2

更新後的nm在檔案“ Test”上運作

0000000000601040 B __bss_start

0000000000601040 b completed.6992

0000000000601030 D __data_start

0000000000601030 W data_start

0000000000400490 t deregister_tm_clones

0000000000400500 t __do_global_dtors_aux

0000000000600e18 t __do_global_dtors_aux_fini_array_entry

0000000000601038 D __dso_handle

0000000000600e28 d _DYNAMIC

0000000000601040 D _edata

0000000000601048 B _end

0000000000400614 T _fini

0000000000400520 t frame_dummy

0000000000600e10 t __frame_dummy_init_array_entry

0000000000400748 r __FRAME_END__

0000000000601000 d _GLOBAL_OFFSET_TABLE_

w __gmon_start__

00000000004003f8 T _init

0000000000600e18 t __init_array_end

0000000000600e10 t __init_array_start

0000000000400620 R _IO_stdin_used

w _ITM_deregisterTMCloneTable

w _ITM_registerTMCloneTable

0000000000600e20 d __JCR_END__

0000000000600e20 d __JCR_LIST__

w _Jv_RegisterClasses

0000000000400610 T __libc_csu_fini

0000000000400580 T __libc_csu_init

U __libc_start_main@@GLIBC_2.2.5

0000000000400550 T main

U printf@@GLIBC_2.2.5

00000000004004c0 t register_tm_clones

0000000000400460 T _start

0000000000601040 D __TMC_END__

llvm-readobj對檔案的結果:

I:\LLVM_BUILD\VC12\64\Release\bin>llvm-readobj -file-headers Test

File: Test

Format: ELF64-x86-64

Arch: x86_64

AddressSize: 64bit

LoadName:

ElfHeader {

Ident {

Magic: (7F 45 4C 46)

Class: 64-bit (0x2)

DataEncoding: LittleEndian (0x1)

FileVersion: 1

OS/ABI: SystemV (0x0)

ABIVersion: 0

Unused: (00 00 00 00 00 00 00)

}

Type: Executable (0x2)

Machine: EM_X86_64 (0x3E)

Version: 1

Entry: 0x400460

ProgramHeaderOffset: 0x40

SectionHeaderOffset: 0x11C0

Flags [ (0x0)

]

HeaderSize: 64

ProgramHeaderEntrySize: 56

ProgramHeaderCount: 9

SectionHeaderEntrySize: 64

SectionHeaderCount: 30

StringTableSectionIndex: 27

以及實際連結的表面上可執行檔案本身:

https://dl.dropboxusercontent.com/u/1735585/Test