2013-04-23 40 views
5

Tôi có một bộ phần mềm được viết bằng 'C'. Điều này thường được biên dịch bằng cách sử dụng acc và chạy trên một hệ thống UNIX Solaris nhưng tôi đã được giao nhiệm vụ làm cho nó chạy dưới Linux trên một hộp x86_64.Lỗi phân đoạn: 0x0000000000000001 trong ??() cố gắng biên dịch/liên kết dưới Linux

Tôi không quen thuộc với gcc hoặc Linux nhưng tôi đã quản lý để lấy mã để biên dịch chỉ với một số thay đổi tối thiểu để loại bỏ cảnh báo không có trong Solaris. Tôi đang sử dụng lệnh sau biên dịch (gọi từ một kịch bản, do đó các biến môi trường):

/usr/bin/gcc -L/tmp/lib -L/tmp/usr/lib -c -fPIC -g -I$WORKING_DIR $INCLUDE $WORKING_DIR/$FILE 

Hầu hết các nguồn sau đó được đặt trong chia sẻ (.so) thư viện, cũng thông qua kịch bản, sử dụng lệnh sau:

ld $GLOSS_SUB_DIR/$REL_DIR/obj/$PREFIX*".o" -G -o $GLOSS_SUB_DIR/$REL_DIR/lib/$LIB$NEW_MIN_VER_NO 

một makefile mẫu cho một thực thi gọi là 'gsproc' là như sau:

CONTROL_NO = $(shell awk 'BEGIN{FS=","} /control/ {printf "%s%s", $$3,$$4} END{}' $$GLOSS_DIR/subenv_list) 

CTRL_PATH = $(GLOSS_DIR)/control/$(CONTROL_NO) 

OBJECTS = $(CTRL_PATH)/nolib/gsproc.o \ 
      $(CTRL_PATH)/nolib/w_bkg_shared.o 

LIBS = -lcontrolw \ 
      -lsharew \ 
      -lsybdb64 


gsproc: $(OBJECTS) 
    gcc -shared -fPIC -o $(TMP_DIR)/gsproc \ 
     -L $(SYBASE)/$(SYBASE_OCS)/devlib \ 
      $(OBJECTS) $(LIBS) -lm -lc –lnsl 

tôi đã thành công trong việc lập và sau đó liên kết tất cả các mã nhưng mỗi thực thi hiện nay rơi ngay lập tức khi khởi động với lỗi phân đoạn và kết xuất lõi. Tất cả những gì tôi nhận được từ gdb là:

GNU gdb (GDB) Red Hat Enterprise Linux (7.2-50.el6) 
Copyright (C) 2010 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-redhat-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
Reading symbols from /gloss_env/GLSLAZ_TST2/control/C2.0.0/bin/gsproc...done. 
(gdb) run 
Starting program: /gloss_env/GLSLAZ_TST2/control/C2.0.0/bin/gsproc 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000000001 in ??() 

Vì vậy, có vẻ như vấn đề không phải là mã. Có lẽ tôi đang làm một cái gì đó sai với trình biên dịch của tôi hoặc tùy chọn liên kết.

+0

Sử dụng gcc, không phải ld để liên kết. –

+0

Cảm ơn phản hồi. Tôi đã xem xét điều đó nhưng tôi nghĩ gcc chỉ gọi ld anyway? Tôi đã thừa hưởng một tập hợp khá liên quan của các kịch bản mà xử lý việc biên dịch và dân số của các thư viện được chia sẻ. Tùy thuộc vào tiền tố trên tệp nguồn, các đối tượng phải đi vào các thư viện khác nhau vì vậy tôi đã cố gắng không phải thay đổi quá lớn đối với cơ chế hiện tại. Nếu tôi định cư thư viện .so qua gcc, tùy chọn dòng lệnh để sử dụng là gì? Làm thế nào để tôi nói cho nó thư viện mà đối tượng cần phải được nạp vào? – user2311565

+0

gcc không gọi ld, nhưng với các tùy chọn nội bộ được áp dụng, nếu không bạn sẽ mất tích nếu sử dụng ld trực tiếp. Bạn có lẽ nên đọc: http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html. Nó sẽ là tốt nhất nếu bạn sử dụng một hệ thống xây dựng thực tế cho điều này mặc dù, mà sẽ đảm bảo một xây dựng chính xác. Tôi khuyên bạn nên CMake (http://www.cmake.org) cho phép bạn sử dụng cùng một hệ thống xây dựng trên tất cả các nền tảng. Automake (http://www.gnu.org/software/automake) là một lựa chọn khác, hoạt động cùng với Autoconf (http://www.gnu.org/software/autoconf). Nói chung, sử dụng CMake nếu bạn có thể. –

Trả lời

0

này quy tắc Makefile/gcc lệnh

gsproc: $(OBJECTS) 
    gcc -shared -fPIC -o $(TMP_DIR)/gsproc \ 
     -L $(SYBASE)/$(SYBASE_OCS)/devlib \ 
      $(OBJECTS) $(LIBS) -lm -lc –lnsl 

làm cho một đối tượng gsproc namde chia sẻ (không có tiền tố lib bình thường và .so hậu tố). Một tệp thực thi và một thư viện là cùng một tệp định dạng trong nhiều hệ điều hành, với tác dụng phụ mà bạn có thể thử chạy một thư viện được chia sẻ dưới dạng tệp thực thi. Nhưng kết quả thường là những gì bạn thấy, sự cố tức thì, v.v.

Các vấn đề liên quan