Sự cốLàm thế nào để 'liên kết' tập tin đối tượng để thực thi/biên dịch nhị phân?
Tôi muốn đưa tệp đối tượng vào nhị phân hiện có. Như một ví dụ cụ thể, hãy xem xét một nguồn Hello.c
:
#include <stdlib.h>
int main(void)
{
return EXIT_SUCCESS;
}
Nó có thể được biên dịch để thực thi một cách đặt tên Hello
qua gcc -std=gnu99 -Wall Hello.c -o Hello
. Hơn nữa, bây giờ xem xét Embed.c
:
func1(void)
{
}
Một đối tượng tập tin Embed.o
thể được tạo ra từ này thông qua gcc -c Embed.c
. Câu hỏi của tôi là cách chèn thông thường Embed.o
vào Hello
sao cho các chuyển vị cần thiết được thực hiện và các bảng nội bộ ELF thích hợp (ví dụ: bảng biểu tượng, PLT, v.v.) được vá đúng cách?
Giả
Nó có thể được giả định rằng các tập tin đối tượng được nhúng có phụ thuộc của nó liên kết tĩnh rồi. Bất kỳ phụ thuộc động nào, chẳng hạn như thời gian chạy C có thể được giả định là có mặt trong thực thi đích.
Những nỗ lực hiện tại/Ý tưởng
- Sử dụng
libbfd
để sao chép phần từ tập tin đối tượng vào nhị phân. Tiến trình tôi đã thực hiện với điều này là tôi có thể tạo một đối tượng mới với các phần từ nhị phân gốc và các phần từ tệp đối tượng. Vấn đề là do tệp đối tượng có thể định vị lại, nên các phần của nó không thể được sao chép đúng vào đầu ra mà không thực hiện các chuyển vị trí đầu tiên. - Chuyển đổi tệp nhị phân trở lại thành tệp đối tượng và liên kết lại với
ld
. Cho đến nay tôi đã thử sử dụngobjcopy
để thực hiện chuyển đổiobjcopy --input elf64-x86-64 --output elf64-x86-64 Hello Hello.o
. Rõ ràng điều này không hoạt động như tôi dự định kể từ khild -o Hello2 Embed.o Hello.o
sau đó sẽ dẫn đếnld: error: Hello.o: unsupported ELF file type 2
. Tôi đoán điều này nên được mong đợi mặc dù kể từ khiHello
không phải là một tập tin đối tượng. - Tìm công cụ hiện có thực hiện loại chèn này?
Lý (Không bắt buộc đọc)
Tôi đang làm cho một trình soạn thảo thực thi tĩnh, nơi mà tầm nhìn là để cho phép các thiết bị đo đạc của thói quen người dùng định nghĩa tùy ý vào một nhị phân hiện có. Thao tác này sẽ hoạt động theo hai bước:
- Việc tiêm tệp đối tượng (chứa thói quen do người dùng xác định) vào nhị phân. Đây là bước bắt buộc và không thể làm việc xung quanh bằng các lựa chọn thay thế chẳng hạn như tiêm đối tượng dùng chung thay thế.
- Thực hiện phân tích tĩnh trên nhị phân mới và sử dụng phép phân tích tĩnh này từ các mã gốc sang mã mới được thêm vào.
Tôi có, phần lớn, đã hoàn thành công việc cần thiết cho bước 2, nhưng tôi gặp sự cố với việc tiêm tệp đối tượng. Vấn đề chắc chắn là có thể giải quyết được vì các công cụ khác sử dụng cùng một phương pháp tiêm đối tượng (ví dụ: EEL).
Một đọc nhanh các câu hỏi để lại cảm giác rằng khái niệm giữa một trình liên kết thời gian chạy và một trình liên kết thông thường không được hiểu. Trình liên kết thời gian chạy/trình liên kết/chương trình chỉ hoạt động trên các định dạng dễ sửa và nhanh chóng. .o không phải là một trong những :-) Nếu nó có phụ thuộc tối thiểu, như một codec, liên kết với mã tối thiểu để làm cho nó một .so âm thanh như các tuyến đường logic –
@MarcovandeVoort: Cảm ơn bạn đã bình luận :) Tôi đã sử dụng 'liên kết 'thuật ngữ lỏng lẻo, như người ta có thể sử dụng' tiêm ', đó là lý do tại sao tôi đặt nó trong dấu ngoặc kép. Một trong những lý do tôi không thể biến nó thành '.so', là các thủ thuật tiêm như' LD_PRELOAD' có thể bị ứng dụng phá hoại. Không chỉ vậy, nó đòi hỏi sự phân bố của một thư viện bổ sung tạo thành môi trường mới. Việc tẩy lông tĩnh có nhiều ưu điểm khác nhau (đặc biệt là cho mục đích của dự án này), nhưng như tôi đã nói cả trong câu hỏi và nhận xét cho câu trả lời, đây không phải là quyết định thiết kế mà tôi có thể thay đổi :) –
Bạn đang cố gắng làm điều gì đó như khả năng của ld trên AIX (và không nơi nào khác mà tôi biết) để liên kết lại một tệp thực thi mà chỉ có một tệp đối tượng đã thay đổi? –