Tôi đang cố gắng tháo rời chương trình để xem hướng dẫn lắp ráp syscall (lệnh INT, tôi tin) và trình xử lý với GDB và đã viết một chương trình nhỏ (xem bên dưới) để mở và đóng tệp. Tôi đã có thể làm theo các cuộc gọi để fopen với GDB cho đến khi nó thực hiện một cuộc gọi. Khi tôi cố gắng nói với GDB "tháo rời 0x ...." (địa chỉ cuộc gọi), nó trả lời bằng 'Không có hàm nào chứa địa chỉ được chỉ định.' Có thể buộc GDB phải tháo rời (hoặc hiển thị nó trong trình biên dịch càng tốt càng tốt) địa chỉ bộ nhớ đó không? Nếu vậy, làm thế nào?Tôi làm cách nào để buộc GDB phải tháo rời?
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE* f;
f = fopen("main.c", "r");
if (!f) {
perror("open");
return -1;
}
fclose(f);
return 0;
}
fopen() không phải là cuộc gọi hệ thống, đó là cuộc gọi đến thư viện chuẩn C. Và tại sao bạn nghĩ rằng một cuộc gọi hệ thống phải được thực hiện thông qua một hướng dẫn INT? –
Tôi có thể sai, nhưng chúng tôi đã được dạy rằng các cuộc gọi fopen cuối cùng dẫn đến một cuộc gọi hệ thống đến hạt nhân để mở tệp và trả về một bộ mô tả tệp? – Patrick
Patrick: Vâng, nhưng không cần phải làm điều đó một cách trực tiếp. Thông thường nó gọi hàm libc mà sau đó nhập hạt nhân. Nhưng gọi nhân có thể được thực hiện không chỉ với int (điều này là chậm) nhưng với syscall/sysenter tùy thuộc vào kiến trúc bộ xử lý ... – k3a