Có cách nào để ghi đè lên các hàm có phạm vi tĩnh trong mô-đun đối tượng không?Có thể ghi đè các hàm tĩnh trong một mô-đun đối tượng (gcc, ld, x86, objcopy) không?
Nếu tôi bắt đầu với một cái gì đó như thế này, một mô-đun với toàn cầu biểu tượng "foo" là một chức năng mà các cuộc gọi biểu tượng địa phương "thanh", mà các cuộc gọi ký hiệu cục bộ "baz"
[[email protected] ~]$ cat foo.c
#include <stdio.h>
static void baz(void)
{
printf("baz\n");
}
static void bar(void)
{
printf("bar\n");
baz();
}
void foo(void)
{
printf("foo\n");
bar();
}
[[email protected] ~]$ gcc -g -c foo.c
[[email protected] ~]$ objdump -x foo.o | egrep 'foo|bar|baz'
foo.o: file format elf32-i386
foo.o
00000000 l df *ABS* 00000000 foo.c
00000000 l F .text 00000014 baz
00000014 l F .text 00000019 bar
0000002d g F .text 00000019 foo
Nó có một toàn cầu, "foo" và hai địa phương "bar" và "baz".
Giả sử tôi muốn viết một số xét nghiệm đơn vị đó thực hiện thanh và baz, tôi có thể làm:
[[email protected] ~]$ cat barbaz
bar
baz
[[email protected] ~]$ objcopy --globalize-symbols=barbaz foo.o foo2.o
[[email protected] ~]$ objdump -x foo2.o | egrep 'foo|bar|baz'
foo2.o: file format elf32-i386
foo2.o
00000000 l df *ABS* 00000000 foo.c
00000000 g F .text 00000014 baz
00000014 g F .text 00000019 bar
0000002d g F .text 00000019 foo
[[email protected] ~]$
Và bây giờ bar và baz là biểu tượng toàn cầu và truy cập từ bên ngoài module. Càng xa càng tốt.
Nhưng điều gì sẽ xảy ra nếu tôi muốn kết hợp chức năng của chính mình lên trên của "baz" và có "bar" gọi "baz" xen kẽ của tôi?
Có cách nào để làm điều đó không?
tùy chọn --wrap dường như không làm điều đó ...
[[email protected] ~]$ cat ibaz.c
#include <stdio.h>
extern void foo();
extern void bar();
void __wrap_baz()
{
printf("wrapped baz\n");
}
int main(int argc, char *argv[])
{
foo();
baz();
}
[[email protected] ~]$ gcc -o ibaz ibaz.c foo2.o -Xlinker --wrap -Xlinker baz
[[email protected] ~]$ ./ibaz
foo
bar
baz
wrapped baz
[[email protected] ~]$
Các baz gọi từ main() đã được bao bọc, nhưng thanh vẫn gọi là baz địa phương không phải là baz bọc.
Có cách nào để thực hiện thanh gọi cho bazơ được bao bọc không?
Thậm chí nếu nó yêu cầu sửa đổi mã đối tượng để tinker với địa chỉ của cuộc gọi hàm, nếu có thể được thực hiện theo cách tự động, có thể đủ tốt, nhưng trong trường hợp đó cần phải làm việc trên ít nhất i386 và x86_64.
- steve
Tôi chưa sử dụng các ký hiệu yếu, nhưng chúng có vẻ giống như bazơ yếu của mô-đun ban đầu sẽ cho phép bạn thay thế bằng một mô-đun mới – x539
Tôi tưởng tượng rằng nếu anh ấy cố gắng làm những việc như vậy, anh ấy không có quyền truy cập vào nguồn mã số –
Tôi có quyền truy cập vào mã nguồn, nhưng tôi không muốn sửa đổi nguồn theo cách thông thường của kiểm tra đơn vị. Trên thực tế điều này là để thử nghiệm một mô-đun hạt nhân Linux. Thượng lưu, họ thường không thích bạn đặt những thay đổi trong nguồn chỉ dành cho những thứ mà không phải là hạt nhân, và cho khả năng tương thích vá, tôi không muốn gây rối với nguồn không cần thiết. – smcameron